summarylogtreecommitdiffstats
path: root/download-deps.sh
blob: ee69fd8288a65b771b1cea1dbc74b626477679a1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# This script auto detects dependencies versions and downloads them.
# It can be used to update the PKGBUILD sources.
# It moves existing dependencies from $depspath to $targetdepspath
# and downloads non-existing ones in $targetdepspath

packagejsonpath="$(realpath "$1")"
if [ ! -f "$packagejsonpath" ]; then
  echo "Usage: $0 <path of the main package.json file>"
  exit -1
fi

depspath="$(pwd)"

rm -rf tmp-deps-build deps
mkdir tmp-deps-build deps
tmpbuildpath="$(realpath tmp-deps-build)"

targetdepspath="$depspath/deps"

getsemverspec() {
  local dep="$1"
  local semverspec="$(echo "$dep" | gawk -F'@' '{ print $NF }')"
  echo "$semverspec"
}

getpackagename() {
  local dep="$1"
  local semverspec="$2"
  local package="${dep//@$semverspec}"
  echo "$package"
}

# move from $depspath or download deps to the $targetdepspath
# save info in sourcelist sha1sumslist noextractlist files
onlinebestmatch() {
  local package="$1";
  local semverspec="$2";

  if echo "$semverspec" | grep -q '/'; then
    local fullname="${package}-$(echo "$semverspec" | cut -d/ -f1).zip"
    if [ -f "$depspath/$fullname" ]; then
      mv "$depspath/$fullname" "$targetdepspath/"
    elif [ ! -f "$targetdepspath/$fullname" ]; then
      echo "The $package [version = $semverspec] must be downloaded manually from github to continue."
      exit -1;
    fi
    echo "$fullname"
  else
    local json="$(npm view --json "$package@$semverspec")"
    if [ $(echo "$json" | jq -r '.version?//"INVALID"') = "INVALID" ]; then
      json=$(echo "$json" | jq '.[0]')
    fi
    local version="$(echo "$json" | jq -r '.version' | head -n1)"

    local latestversion="$(echo "$json" | jq '.versions | .[]' | xargs semver -r "$semverspec" | tail -n1)"
    if [ "$version" != "$latestversion" ]; then
      json="$(npm view --json "$package@$latestversion")"
    fi

    local url=$(echo $json | jq -r '.dist.tarball');
    local shasum=$(echo $json | jq -r '.dist.shasum');
    local name=$(echo "$url" | gawk -F'/' '{ print $NF }')

    if ! grep -q "$shasum" "$targetdepspath/sha1sumslist"; then
      echo "$url" >> "$targetdepspath/sourcelist"
      echo "$shasum" >> "$targetdepspath/sha1sumslist"
      echo "$name" >> "$targetdepspath/noextractlist"
      if [ -f "$depspath/$name" ]; then
        mv "$depspath/$name" "$targetdepspath/"
      else
        cd "$targetdepspath/"
        wget "$url"
      fi
    fi
    echo "$name"
  fi
}

recursivedownloaddeps() {
  local target="$1"
  if [ -d "$tmpbuildpath/$target" ]; then
    echo "Downloading dependency $target [cached]"
  else
    echo "Downloading dependency $target (recursively) ..."
    mkdir -p "$tmpbuildpath/$target"
    cd "$tmpbuildpath/$target"
    if [ "${target: -4}" = ".zip" ]; then
      unzip "$targetdepspath/${target}"
    else
      bsdtar xzf "$targetdepspath/${target}"
    fi
    folder=$(ls)
    find "$folder" -mindepth 1 -maxdepth 1 | xargs mv -t .
    rm -r "$folder"
    cat package.json | jq -r '.dependencies | to_entries? | map(.key + "@" + .value) | .[]' | while read dep; do
      local semverspec="$(getsemverspec "$dep")"
      local package="$(getpackagename "$dep" "$semverspec")"
      if [ ! -d "$tmpbuildpath/${target}/node_modules/$package" ]; then
        local subtarget="$(onlinebestmatch "$package" "$semverspec")"
        recursivedownloaddeps "$subtarget"
      fi
    done
  fi
}


downloaddeps() {
  cd "$tmpbuildpath"
  cat "$packagejsonpath" | jq -r '.dependencies, .devDependencies | to_entries? | map(.key + "@" + .value) | .[]' | sort -u | while read dep; do
    local semverspec="$(getsemverspec "$dep")"
    local package="$(getpackagename "$dep" "$semverspec")"
    local target="$(onlinebestmatch "$package" "$semverspec")"
    recursivedownloaddeps "$target"
  done
}

createlist() {
  local arrname="$1"
  local filename="$2"
  echo "${arrname}+=("
  cat "$filename" | sed 's/^/  "/' | sed 's/$/"/'
  echo "  )"
}

downloaddeps

# sorting entries...
cd "$targetdepspath/"
cat sourcelist | gawk '{ n=n+1; print n, $0; }' > a
cat sha1sumslist | gawk '{ n=n+1; print n, $0; }' > b
cat noextractlist | gawk '{ n=n+1; print n, $0; }' > c
cat c | gawk '{ print $2, $1 }' | sort | gawk '{ n=n+1; print $2, n; }' | sort --numeric-sort | gawk '{ print $2 }' > order
paste order a | sort --numeric-sort | gawk '{ print $3 }' > aaa
paste order b | sort --numeric-sort | gawk '{ print $3 }' > bbb
paste order c | sort --numeric-sort | gawk '{ print $3 }' > ccc
createlist source aaa > threelists
createlist sha1sums bbb >> threelists
createlist noextract ccc >> threelists

#createlist source sourcelist > threelists
#createlist sha1sums sha1sumslist >> threelists
#createlist noextract noextractlist >> threelists