summaryrefslogtreecommitdiff
path: root/deps/npm/scripts/clean-old.sh
blob: 32a203e4a5f7e6de60890419407d1f24bb631587 (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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#!/usr/bin/env bash

# look for old 0.x cruft, and get rid of it.
# Should already be sitting in the npm folder.

# This doesn't have to be quite as cross-platform as install.sh.
# There are some bash-isms, because maintaining *two*
# fully-portable posix/bourne sh scripts is too much for
# one project with a sane maintainer.

# If readlink isn't available, then this is just too tricky.
# However, greadlink is fine, so Solaris can join the party, too.
readlink="readlink"
which $readlink >/dev/null 2>/dev/null
if [ $? -ne 0 ]; then
  readlink="greadlink"
  which $readlink >/dev/null 2>/dev/null
  if [ $? -ne 0 ]; then
    echo "Can't find the readlink or greadlink command. Aborting."
    exit 1
  fi
fi

if [ "x$npm_config_prefix" != "x" ]; then
  PREFIXES=$npm_config_prefix
else
  node="$NODE"
  if [ "x$node" = "x" ]; then
    node=`which node`
  fi
  if [ "x$node" = "x" ]; then
    echo "Can't find node to determine prefix. Aborting."
    exit 1
  fi


  PREFIX=`dirname $node`
  PREFIX=`dirname $PREFIX`
  echo "cleanup prefix=$PREFIX"
  PREFIXES=$PREFIX

  altprefix=`"$node" -e process.installPrefix`
  if [ "x$altprefix" != "x" ] && [ "x$altprefix" != "x$PREFIX" ]; then
    echo "altprefix=$altprefix"
    PREFIXES="$PREFIX $altprefix"
  fi
fi

# now prefix is where npm would be rooted by default
# go hunting.

packages=
for prefix in $PREFIXES; do
  packages="$packages
    "`ls "$prefix"/lib/node/.npm 2>/dev/null | grep -v .cache`
done

packages=`echo $packages`

filelist=()
fid=0

for prefix in $PREFIXES; do
  # remove any links into the .npm dir, or links to
  # version-named shims/symlinks.
  for folder in share/man bin lib/node; do
    find $prefix/$folder -type l | while read file; do
      target=`$readlink $file | grep '/\.npm/'`
      if [ "x$target" != "x" ]; then
        # found one!
        filelist[$fid]="$file"
        let 'fid++'
        # also remove any symlinks to this file.
        base=`basename "$file"`
        base=`echo "$base" | awk -F@ '{print $1}'`
        if [ "x$base" != "x" ]; then
          find "`dirname $file`" -type l -name "$base"'*' \
          | while read l; do
              target=`$readlink "$l" | grep "$base"`
              if [ "x$target" != "x" ]; then
                filelist[$fid]="$1"
                let 'fid++'
              fi
            done
        fi
      fi
    done

    # Scour for shim files.  These are relics of 0.2 npm installs.
    # note: grep -r is not portable.
    find $prefix/$folder -type f \
      | xargs grep -sl '// generated by npm' \
      | while read file; do
          filelist[$fid]="$file"
          let 'fid++'
        done
  done

  # now remove the package modules, and the .npm folder itself.
  if [ "x$packages" != "x" ]; then
    for pkg in $packages; do
      filelist[$fid]="$prefix/lib/node/$pkg"
      let 'fid++'
      for i in $prefix/lib/node/$pkg\@*; do
        filelist[$fid]="$i"
        let 'fid++'
      done
    done
  fi

  for folder in lib/node/.npm lib/npm share/npm; do
    if [ -d $prefix/$folder ]; then
      filelist[$fid]="$prefix/$folder"
      let 'fid++'
    fi
  done
done

# now actually clean, but only if there's anything TO clean
if [ "${#filelist[@]}" -gt 0 ]; then
  echo ""
  echo "This script will find and eliminate any shims, symbolic"
  echo "links, and other cruft that was installed by npm 0.x."
  echo ""

  if [ "x$packages" != "x" ]; then
    echo "The following packages appear to have been installed with"
    echo "an old version of npm, and will be removed forcibly:"
    for pkg in $packages; do
      echo "    $pkg"
    done
    echo "Make a note of these. You may want to install them"
    echo "with npm 1.0 when this process is completed."
    echo ""
  fi

  OK=
  if [ "x$1" = "x-y" ]; then
    OK="yes"
  fi

  while [ "$OK" != "y" ] && [ "$OK" != "yes" ] && [ "$OK" != "no" ]; do
    echo "Is this OK?"
    echo "  enter 'yes' or 'no'"
    echo "  or 'show' to see a list of files "
    read OK
    if [ "x$OK" = "xshow" ] || [ "x$OK" = "xs" ]; then
      for i in "${filelist[@]}"; do
        echo "$i"
      done
    fi
  done
  if [ "$OK" = "no" ]; then
    echo "Aborting"
    exit 1
  fi
  for i in "${filelist[@]}"; do
    rm -rf "$i"
  done
fi

echo ""
echo 'All clean!'

exit 0