ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/install-sh
(Generate patch)

Comparing:
ircd-hybrid-7.2/install-sh (file contents), Revision 913 by michael, Wed Nov 7 23:20:12 2007 UTC vs.
ircd-hybrid/install-sh (file contents), Revision 1028 by michael, Sun Nov 8 13:03:38 2009 UTC

# Line 1 | Line 1
1   #!/bin/sh
2   # install - install a program, script, or datafile
3  
4 < scriptversion=2006-10-14.15
4 > scriptversion=2009-04-28.21; # UTC
5  
6   # This originates from X11R5 (mit/util/scripts/install.sh), which was
7   # later released in X11R6 (xc/config/util/install.sh) with the
# Line 48 | Line 48 | IFS=" ""       $nl"
48   # set DOITPROG to echo to test this script
49  
50   # Don't use :- since 4.3BSD and earlier shells don't like it.
51 < doit="${DOITPROG-}"
51 > doit=${DOITPROG-}
52   if test -z "$doit"; then
53    doit_exec=exec
54   else
# Line 58 | Line 58 | fi
58   # Put in absolute file names if you don't have them in your path;
59   # or use environment vars.
60  
61 < mvprog="${MVPROG-mv}"
62 < cpprog="${CPPROG-cp}"
63 < chmodprog="${CHMODPROG-chmod}"
64 < chownprog="${CHOWNPROG-chown}"
65 < chgrpprog="${CHGRPPROG-chgrp}"
66 < stripprog="${STRIPPROG-strip}"
67 < rmprog="${RMPROG-rm}"
68 < mkdirprog="${MKDIRPROG-mkdir}"
61 > chgrpprog=${CHGRPPROG-chgrp}
62 > chmodprog=${CHMODPROG-chmod}
63 > chownprog=${CHOWNPROG-chown}
64 > cmpprog=${CMPPROG-cmp}
65 > cpprog=${CPPROG-cp}
66 > mkdirprog=${MKDIRPROG-mkdir}
67 > mvprog=${MVPROG-mv}
68 > rmprog=${RMPROG-rm}
69 > stripprog=${STRIPPROG-strip}
70 >
71 > posix_glob='?'
72 > initialize_posix_glob='
73 >  test "$posix_glob" != "?" || {
74 >    if (set -f) 2>/dev/null; then
75 >      posix_glob=
76 >    else
77 >      posix_glob=:
78 >    fi
79 >  }
80 > '
81  
70 posix_glob=
82   posix_mkdir=
83  
84   # Desired mode of installed file.
85   mode=0755
86  
87 + chgrpcmd=
88   chmodcmd=$chmodprog
89   chowncmd=
90 < chgrpcmd=
79 < stripcmd=
90 > mvcmd=$mvprog
91   rmcmd="$rmprog -f"
92 < mvcmd="$mvprog"
92 > stripcmd=
93 >
94   src=
95   dst=
96   dir_arg=
97 < dstarg=
97 > dst_arg=
98 >
99 > copy_on_change=false
100   no_target_directory=
101  
102 < usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
102 > usage="\
103 > Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
104     or: $0 [OPTION]... SRCFILES... DIRECTORY
105     or: $0 [OPTION]... -t DIRECTORY SRCFILES...
106     or: $0 [OPTION]... -d DIRECTORIES...
# Line 95 | Line 110 | In the 2nd and 3rd, copy all SRCFILES to
110   In the 4th, create DIRECTORIES.
111  
112   Options:
113 < -c         (ignored)
114 < -d         create directories instead of installing files.
115 < -g GROUP   $chgrpprog installed files to GROUP.
116 < -m MODE    $chmodprog installed files to MODE.
117 < -o USER    $chownprog installed files to USER.
118 < -s         $stripprog installed files.
119 < -t DIRECTORY  install into DIRECTORY.
120 < -T         report an error if DSTFILE is a directory.
121 < --help     display this help and exit.
122 < --version  display version info and exit.
113 >     --help     display this help and exit.
114 >     --version  display version info and exit.
115 >
116 >  -c            (ignored)
117 >  -C            install only if different (preserve the last data modification time)
118 >  -d            create directories instead of installing files.
119 >  -g GROUP      $chgrpprog installed files to GROUP.
120 >  -m MODE       $chmodprog installed files to MODE.
121 >  -o USER       $chownprog installed files to USER.
122 >  -s            $stripprog installed files.
123 >  -t DIRECTORY  install into DIRECTORY.
124 >  -T            report an error if DSTFILE is a directory.
125  
126   Environment variables override the default commands:
127 <  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
127 >  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
128 >  RMPROG STRIPPROG
129   "
130  
131   while test $# -ne 0; do
132    case $1 in
133 <    -c) shift
134 <        continue;;
133 >    -c) ;;
134 >
135 >    -C) copy_on_change=true;;
136  
137 <    -d) dir_arg=true
119 <        shift
120 <        continue;;
137 >    -d) dir_arg=true;;
138  
139      -g) chgrpcmd="$chgrpprog $2"
140 <        shift
124 <        shift
125 <        continue;;
140 >        shift;;
141  
142      --help) echo "$usage"; exit $?;;
143  
144      -m) mode=$2
130        shift
131        shift
145          case $mode in
146            *' '* | *'    '* | *'
147   '*        | *'*'* | *'?'* | *'['*)
148              echo "$0: invalid mode: $mode" >&2
149              exit 1;;
150          esac
151 <        continue;;
151 >        shift;;
152  
153      -o) chowncmd="$chownprog $2"
154 <        shift
155 <        shift
156 <        continue;;
157 <
158 <    -s) stripcmd=$stripprog
159 <        shift
160 <        continue;;
161 <
149 <    -t) dstarg=$2
150 <        shift
151 <        shift
152 <        continue;;
153 <
154 <    -T) no_target_directory=true
155 <        shift
156 <        continue;;
154 >        shift;;
155 >
156 >    -s) stripcmd=$stripprog;;
157 >
158 >    -t) dst_arg=$2
159 >        shift;;
160 >
161 >    -T) no_target_directory=true;;
162  
163      --version) echo "$0 $scriptversion"; exit $?;;
164  
# Line 165 | Line 170 | while test $# -ne 0; do
170  
171      *)  break;;
172    esac
173 +  shift
174   done
175  
176 < if test $# -ne 0 && test -z "$dir_arg$dstarg"; then
176 > if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
177    # When -d is used, all remaining arguments are directories to create.
178    # When -t is used, the destination is already specified.
179    # Otherwise, the last argument is the destination.  Remove it from $@.
180    for arg
181    do
182 <    if test -n "$dstarg"; then
182 >    if test -n "$dst_arg"; then
183        # $@ is not empty: it contains at least $arg.
184 <      set fnord "$@" "$dstarg"
184 >      set fnord "$@" "$dst_arg"
185        shift # fnord
186      fi
187      shift # arg
188 <    dstarg=$arg
188 >    dst_arg=$arg
189    done
190   fi
191  
# Line 224 | Line 230 | for src
230   do
231    # Protect names starting with `-'.
232    case $src in
233 <    -*) src=./$src ;;
233 >    -*) src=./$src;;
234    esac
235  
236    if test -n "$dir_arg"; then
# Line 242 | Line 248 | do
248        exit 1
249      fi
250  
251 <    if test -z "$dstarg"; then
251 >    if test -z "$dst_arg"; then
252        echo "$0: no destination specified." >&2
253        exit 1
254      fi
255  
256 <    dst=$dstarg
256 >    dst=$dst_arg
257      # Protect names starting with `-'.
258      case $dst in
259 <      -*) dst=./$dst ;;
259 >      -*) dst=./$dst;;
260      esac
261  
262      # If destination is a directory, append the input filename; won't work
263      # if double slashes aren't ignored.
264      if test -d "$dst"; then
265        if test -n "$no_target_directory"; then
266 <        echo "$0: $dstarg: Is a directory" >&2
266 >        echo "$0: $dst_arg: Is a directory" >&2
267          exit 1
268        fi
269        dstdir=$dst
# Line 378 | Line 384 | do
384        # directory the slow way, step by step, checking for races as we go.
385  
386        case $dstdir in
387 <        /*) prefix=/ ;;
388 <        -*) prefix=./ ;;
389 <        *)  prefix= ;;
387 >        /*) prefix='/';;
388 >        -*) prefix='./';;
389 >        *)  prefix='';;
390        esac
391  
392 <      case $posix_glob in
387 <        '')
388 <          if (set -f) 2>/dev/null; then
389 <            posix_glob=true
390 <          else
391 <            posix_glob=false
392 <          fi ;;
393 <      esac
392 >      eval "$initialize_posix_glob"
393  
394        oIFS=$IFS
395        IFS=/
396 <      $posix_glob && set -f
396 >      $posix_glob set -f
397        set fnord $dstdir
398        shift
399 <      $posix_glob && set +f
399 >      $posix_glob set +f
400        IFS=$oIFS
401  
402        prefixes=
# Line 459 | Line 458 | do
458      # ignore errors from any of these, just make sure not to ignore
459      # errors from the above "$doit $cpprog $src $dsttmp" command.
460      #
461 <    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
462 <      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
463 <      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
464 <      && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
465 <
466 <    # Now rename the file to the real destination.
467 <    { $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null \
468 <      || {
469 <           # The rename failed, perhaps because mv can't rename something else
470 <           # to itself, or perhaps because mv is so ancient that it does not
471 <           # support -f.
472 <
473 <           # Now remove or move aside any old file at destination location.
474 <           # We try this two ways since rm can't unlink itself on some
475 <           # systems and the destination file might be busy for other
476 <           # reasons.  In this case, the final cleanup might fail but the new
477 <           # file should still install successfully.
478 <           {
479 <             if test -f "$dst"; then
480 <               $doit $rmcmd -f "$dst" 2>/dev/null \
481 <               || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null \
482 <                     && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }; }\
483 <               || {
484 <                 echo "$0: cannot unlink or rename $dst" >&2
485 <                 (exit 1); exit 1
486 <               }
487 <             else
488 <               :
489 <             fi
490 <           } &&
491 <
492 <           # Now rename the file to the real destination.
493 <           $doit $mvcmd "$dsttmp" "$dst"
494 <         }
495 <    } || exit 1
461 >    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
462 >    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
463 >    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
464 >    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
465 >
466 >    # If -C, don't bother to copy if it wouldn't change the file.
467 >    if $copy_on_change &&
468 >       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
469 >       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
470 >
471 >       eval "$initialize_posix_glob" &&
472 >       $posix_glob set -f &&
473 >       set X $old && old=:$2:$4:$5:$6 &&
474 >       set X $new && new=:$2:$4:$5:$6 &&
475 >       $posix_glob set +f &&
476 >
477 >       test "$old" = "$new" &&
478 >       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
479 >    then
480 >      rm -f "$dsttmp"
481 >    else
482 >      # Rename the file to the real destination.
483 >      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
484 >
485 >      # The rename failed, perhaps because mv can't rename something else
486 >      # to itself, or perhaps because mv is so ancient that it does not
487 >      # support -f.
488 >      {
489 >        # Now remove or move aside any old file at destination location.
490 >        # We try this two ways since rm can't unlink itself on some
491 >        # systems and the destination file might be busy for other
492 >        # reasons.  In this case, the final cleanup might fail but the new
493 >        # file should still install successfully.
494 >        {
495 >          test ! -f "$dst" ||
496 >          $doit $rmcmd -f "$dst" 2>/dev/null ||
497 >          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
498 >            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
499 >          } ||
500 >          { echo "$0: cannot unlink or rename $dst" >&2
501 >            (exit 1); exit 1
502 >          }
503 >        } &&
504 >
505 >        # Now rename the file to the real destination.
506 >        $doit $mvcmd "$dsttmp" "$dst"
507 >      }
508 >    fi || exit 1
509  
510      trap '' 0
511    fi
# Line 503 | Line 515 | done
515   # eval: (add-hook 'write-file-hooks 'time-stamp)
516   # time-stamp-start: "scriptversion="
517   # time-stamp-format: "%:y-%02m-%02d.%02H"
518 < # time-stamp-end: "$"
518 > # time-stamp-time-zone: "UTC"
519 > # time-stamp-end: "; # UTC"
520   # End:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines