| #!/bin/sh |
| |
| # A word about this shell script: |
| # |
| # It must work everywhere, including on systems that lack |
| # a /bin/bash, map 'sh' to ksh, ksh97, bash, ash, or zsh, |
| # and potentially have either a posix shell or bourne |
| # shell living at /bin/sh. |
| # |
| # See this helpful document on writing portable shell scripts: |
| # http://www.gnu.org/s/hello/manual/autoconf/Portable-Shell.html |
| # |
| # The only shell it won't ever work on is cmd.exe. |
| |
| if [ "x$0" = "xsh" ]; then |
| # run as curl | sh |
| # on some systems, you can just do cat>npm-install.sh |
| # which is a bit cuter. But on others, &1 is already closed, |
| # so catting to another script file won't do anything. |
| curl -s https://npmjs.org/install.sh > npm-install-$$.sh |
| sh npm-install-$$.sh |
| ret=$? |
| rm npm-install-$$.sh |
| exit $ret |
| fi |
| |
| # See what "npm_config_*" things there are in the env, |
| # and make them permanent. |
| # If this fails, it's not such a big deal. |
| configures="`env | grep 'npm_config_' | sed -e 's|^npm_config_||g'`" |
| |
| npm_config_loglevel="error" |
| if [ "x$npm_debug" = "x" ]; then |
| (exit 0) |
| else |
| echo "Running in debug mode." |
| echo "Note that this requires bash or zsh." |
| set -o xtrace |
| set -o pipefail |
| npm_config_loglevel="verbose" |
| fi |
| export npm_config_loglevel |
| |
| # make sure that node exists |
| node=`which node 2>&1` |
| ret=$? |
| if [ $ret -eq 0 ] && [ -x "$node" ]; then |
| (exit 0) |
| else |
| echo "npm cannot be installed without nodejs." >&2 |
| echo "Install node first, and then try again." >&2 |
| echo "" >&2 |
| echo "Maybe node is installed, but not in the PATH?" >&2 |
| echo "Note that running as sudo can change envs." >&2 |
| echo "" |
| echo "PATH=$PATH" >&2 |
| exit $ret |
| fi |
| |
| # set the temp dir |
| TMP="${TMPDIR}" |
| if [ "x$TMP" = "x" ]; then |
| TMP="/tmp" |
| fi |
| TMP="${TMP}/npm.$$" |
| rm -rf "$TMP" || true |
| mkdir "$TMP" |
| if [ $? -ne 0 ]; then |
| echo "failed to mkdir $TMP" >&2 |
| exit 1 |
| fi |
| |
| BACK="$PWD" |
| |
| ret=0 |
| tar="${TAR}" |
| if [ -z "$tar" ]; then |
| tar="${npm_config_tar}" |
| fi |
| if [ -z "$tar" ]; then |
| tar=`which tar 2>&1` |
| ret=$? |
| fi |
| |
| if [ $ret -eq 0 ] && [ -x "$tar" ]; then |
| echo "tar=$tar" |
| echo "version:" |
| $tar --version |
| ret=$? |
| fi |
| |
| if [ $ret -eq 0 ]; then |
| (exit 0) |
| else |
| echo "No suitable tar program found." |
| exit 1 |
| fi |
| |
| |
| |
| # Try to find a suitable make |
| # If the MAKE environment var is set, use that. |
| # otherwise, try to find gmake, and then make. |
| # If no make is found, then just execute the necessary commands. |
| |
| # XXX For some reason, make is building all the docs every time. This |
| # is an annoying source of bugs. Figure out why this happens. |
| MAKE=NOMAKE |
| |
| if [ "x$MAKE" = "x" ]; then |
| make=`which gmake 2>&1` |
| if [ $? -eq 0 ] && [ -x $make ]; then |
| (exit 0) |
| else |
| make=`which make 2>&1` |
| if [ $? -eq 0 ] && [ -x $make ]; then |
| (exit 0) |
| else |
| make=NOMAKE |
| fi |
| fi |
| else |
| make="$MAKE" |
| fi |
| |
| if [ -x "$make" ]; then |
| (exit 0) |
| else |
| # echo "Installing without make. This may fail." >&2 |
| make=NOMAKE |
| fi |
| |
| # If there's no bash, then don't even try to clean |
| if [ -x "/bin/bash" ]; then |
| (exit 0) |
| else |
| clean="no" |
| fi |
| |
| node_version=`"$node" --version 2>&1` |
| ret=$? |
| if [ $ret -ne 0 ]; then |
| echo "You need node to run this program." >&2 |
| echo "node --version reports: $node_version" >&2 |
| echo "with exit code = $ret" >&2 |
| echo "Please install node before continuing." >&2 |
| exit $ret |
| fi |
| |
| t="${npm_install}" |
| if [ -z "$t" ]; then |
| # switch based on node version. |
| # note that we can only use strict sh-compatible patterns here. |
| case $node_version in |
| 0.[012345].* | v0.[012345].*) |
| echo "You are using an outdated and unsupported version of" >&2 |
| echo "node ($node_version). Please update node and try again." >&2 |
| exit 99 |
| ;; |
| v0.[678].* | 0.[678].*) |
| echo "install npm@1.1" |
| t=1.1 |
| ;; |
| *) |
| echo "install npm@latest" |
| t="latest" |
| ;; |
| esac |
| fi |
| |
| # the npmca cert |
| cacert=' |
| -----BEGIN CERTIFICATE----- |
| MIIChzCCAfACCQDauvz/KHp8ejANBgkqhkiG9w0BAQUFADCBhzELMAkGA1UEBhMC |
| VVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMQwwCgYDVQQKEwNucG0x |
| IjAgBgNVBAsTGW5wbSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxDjAMBgNVBAMTBW5w |
| bUNBMRcwFQYJKoZIhvcNAQkBFghpQGl6cy5tZTAeFw0xMTA5MDUwMTQ3MTdaFw0y |
| MTA5MDIwMTQ3MTdaMIGHMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNV |
| BAcTB09ha2xhbmQxDDAKBgNVBAoTA25wbTEiMCAGA1UECxMZbnBtIENlcnRpZmlj |
| YXRlIEF1dGhvcml0eTEOMAwGA1UEAxMFbnBtQ0ExFzAVBgkqhkiG9w0BCQEWCGlA |
| aXpzLm1lMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLI4tIqPpRW+ACw9GE |
| OgBlJZwK5f8nnKCLK629Pv5yJpQKs3DENExAyOgDcyaF0HD0zk8zTp+ZsLaNdKOz |
| Gn2U181KGprGKAXP6DU6ByOJDWmTlY6+Ad1laYT0m64fERSpHw/hjD3D+iX4aMOl |
| y0HdbT5m1ZGh6SJz3ZqxavhHLQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAC4ySDbC |
| l7W1WpLmtLGEQ/yuMLUf6Jy/vr+CRp4h+UzL+IQpCv8FfxsYE7dhf/bmWTEupBkv |
| yNL18lipt2jSvR3v6oAHAReotvdjqhxddpe5Holns6EQd1/xEZ7sB1YhQKJtvUrl |
| ZNufy1Jf1r0ldEGeA+0ISck7s+xSh9rQD2Op |
| -----END CERTIFICATE----- |
| ' |
| |
| echo "$cacert" > "$TMP/cafile.crt" |
| cacert="$TMP/cafile.crt" |
| |
| # need to echo "" after, because Posix sed doesn't treat EOF |
| # as an implied end of line. |
| url=`(curl -SsL --cacert "$cacert" https://registry.npmjs.org/npm/$t; echo "") \ |
| | sed -e 's/^.*tarball":"//' \ |
| | sed -e 's/".*$//'` |
| |
| ret=$? |
| if [ "x$url" = "x" ]; then |
| ret=125 |
| # try without the -e arg to sed. |
| url=`(curl -SsL --cacert "$cacert" https://registry.npmjs.org/npm/$t; echo "") \ |
| | sed 's/^.*tarball":"//' \ |
| | sed 's/".*$//'` |
| ret=$? |
| if [ "x$url" = "x" ]; then |
| ret=125 |
| fi |
| fi |
| if [ $ret -ne 0 ]; then |
| echo "Failed to get tarball url for npm/$t" >&2 |
| exit $ret |
| fi |
| |
| |
| echo "fetching: $url" >&2 |
| |
| cd "$TMP" \ |
| && curl -SsL --cacert "$cacert" "$url" \ |
| | $tar -xzf - \ |
| && rm "$cacert" \ |
| && cd "$TMP"/* \ |
| && (req=`"$node" bin/read-package-json.js package.json engines.node` |
| if [ -d node_modules ]; then |
| "$node" node_modules/semver/bin/semver -v "$node_version" -r "$req" |
| ret=$? |
| else |
| "$node" bin/semver.js -v "$node_version" -r "$req" |
| ret=$? |
| fi |
| if [ $ret -ne 0 ]; then |
| echo "You need node $req to run this program." >&2 |
| echo "node --version reports: $node_version" >&2 |
| echo "Please upgrade node before continuing." >&2 |
| exit $ret |
| fi) \ |
| && (ver=`"$node" bin/read-package-json.js package.json version` |
| isnpm10=0 |
| if [ $ret -eq 0 ]; then |
| req=`"$node" bin/read-package-json.js package.json engines.node` |
| if [ -d node_modules ]; then |
| if "$node" node_modules/semver/bin/semver -v "$ver" -r "1" |
| then |
| isnpm10=1 |
| fi |
| else |
| if "$node" bin/semver -v "$ver" -r ">=1.0"; then |
| isnpm10=1 |
| fi |
| fi |
| fi |
| |
| ret=0 |
| if [ $isnpm10 -eq 1 ] && [ -f "scripts/clean-old.sh" ]; then |
| if [ "x$skipclean" = "x" ]; then |
| (exit 0) |
| else |
| clean=no |
| fi |
| if [ "x$clean" = "xno" ] \ |
| || [ "x$clean" = "xn" ]; then |
| echo "Skipping 0.x cruft clean" >&2 |
| ret=0 |
| elif [ "x$clean" = "xy" ] || [ "x$clean" = "xyes" ]; then |
| NODE="$node" /bin/bash "scripts/clean-old.sh" "-y" |
| ret=$? |
| else |
| NODE="$node" /bin/bash "scripts/clean-old.sh" </dev/tty |
| ret=$? |
| fi |
| fi |
| |
| if [ $ret -ne 0 ]; then |
| echo "Aborted 0.x cleanup. Exiting." >&2 |
| exit $ret |
| fi) \ |
| && (if [ "x$configures" = "x" ]; then |
| (exit 0) |
| else |
| echo "./configure "$configures |
| echo "$configures" > npmrc |
| fi) \ |
| && (if [ "$make" = "NOMAKE" ]; then |
| (exit 0) |
| elif "$make" uninstall install; then |
| (exit 0) |
| else |
| make="NOMAKE" |
| fi |
| if [ "$make" = "NOMAKE" ]; then |
| "$node" cli.js rm npm -gf |
| "$node" cli.js install -gf |
| fi) \ |
| && cd "$BACK" \ |
| && rm -rf "$TMP" \ |
| && echo "It worked" |
| |
| ret=$? |
| if [ $ret -ne 0 ]; then |
| echo "It failed" >&2 |
| fi |
| exit $ret |