summarylogtreecommitdiffstats
path: root/download-deps.sh
blob: eb3db8e7a3e8275a707e9ba092dc11750f96079c (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
# 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"

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

  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"
}

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"
    bsdtar xzf "$targetdepspath/${target}"
    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 package="$(echo "$dep" | gawk -F'@' '{ print $1 }')"
      local semverspec="$(echo "$dep" | gawk -F'@' '{ print $2 }')"
      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 package="$(echo "$dep" | gawk -F'@' '{ print $1 }')"
    local semverspec="$(echo "$dep" | gawk -F'@' '{ print $2 }')"
    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