yarn 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #!/bin/sh
  2. #
  3. # This script acts like the "yarn" command, but uses Tailscale's
  4. # currently-desired version, downloading it (and node) first if necessary.
  5. set -eu
  6. NODE_DIR="$HOME/.cache/tailscale-node"
  7. read -r YARN_REV < "$(dirname "$0")/yarn.rev"
  8. YARN_DIR="$HOME/.cache/tailscale-yarn"
  9. # This works for linux and darwin, which is sufficient
  10. # (we do not build for other targets).
  11. OS=$(uname -s | tr A-Z a-z)
  12. ARCH="$(uname -m)"
  13. if [ "$ARCH" = "aarch64" ]; then
  14. # Node uses the name "arm64".
  15. ARCH="arm64"
  16. elif [ "$ARCH" = "x86_64" ]; then
  17. # Node uses the name "x64".
  18. ARCH="x64"
  19. fi
  20. install_node() {
  21. read -r NODE_REV < "$(dirname "$0")/node.rev"
  22. NODE_URL="https://nodejs.org/dist/v${NODE_REV}/node-v${NODE_REV}-${OS}-${ARCH}.tar.gz"
  23. install_tool "node" $NODE_REV $NODE_DIR $NODE_URL
  24. }
  25. install_yarn() {
  26. YARN_URL="https://github.com/yarnpkg/yarn/releases/download/v$YARN_REV/yarn-v$YARN_REV.tar.gz"
  27. install_tool "yarn" $YARN_REV $YARN_DIR $YARN_URL
  28. }
  29. install_tool() {
  30. TOOL=$1
  31. REV=$2
  32. TOOLCHAIN=$3
  33. URL=$4
  34. archive="$TOOLCHAIN-$REV.tar.gz"
  35. mark="$TOOLCHAIN.extracted"
  36. extracted=
  37. [ ! -e "$mark" ] || read -r extracted junk <$mark
  38. if [ "$extracted" = "$REV" ] && [ -e "$TOOLCHAIN/bin/$TOOL" ]; then
  39. # Already extracted, continue silently
  40. return 0
  41. fi
  42. rm -f "$archive.new" "$TOOLCHAIN.extracted"
  43. if [ ! -e "$archive" ]; then
  44. log "Need to download $TOOL '$REV' from $URL."
  45. curl -f -L -o "$archive.new" $URL
  46. rm -f "$archive"
  47. mv "$archive.new" "$archive"
  48. fi
  49. log "Extracting $TOOL '$REV' into '$TOOLCHAIN'." >&2
  50. rm -rf "$TOOLCHAIN"
  51. mkdir -p "$TOOLCHAIN"
  52. (cd "$TOOLCHAIN" && tar --strip-components=1 -xf "$archive")
  53. echo "$REV" >$mark
  54. }
  55. log() {
  56. echo "$@" >&2
  57. }
  58. if [ "${YARN_REV}" = "SKIP" ] ||
  59. [ "${OS}" != "darwin" -a "${OS}" != "linux" ] ||
  60. [ "${ARCH}" != "x64" -a "${ARCH}" != "arm64" ]; then
  61. log "Using existing yarn (`which yarn`)."
  62. exec yarn "$@"
  63. fi
  64. install_node
  65. install_yarn
  66. exec /usr/bin/env PATH="$NODE_DIR/bin:$PATH" "$YARN_DIR/bin/yarn" "$@"