* lib/install-sh: If "mv -f" works, use it.
authorPaul Eggert <eggert@cs.ucla.edu>
Fri, 2 Apr 2004 01:43:29 +0000 (01:43 +0000)
committerPaul Eggert <eggert@cs.ucla.edu>
Fri, 2 Apr 2004 01:43:29 +0000 (01:43 +0000)
ChangeLog
lib/install-sh

index fd44f27..1451879 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2004-04-01  Paul Eggert  <eggert@twinsun.com>
+
+       * lib/install-sh: If "mv -f" works, use it, and fall back to
+       the old "test -f" + "rm -f" + "mv" method only if "mv -f" does
+       not work.  This improves performance in the usual case where
+       "mv -f" works.  It also lets us install the "mv" command
+       without worrying about a small window where "mv" does not
+       exist (this problem was reported by Raul Nunez de Arenas
+       Coronado).
+
 2004-03-26  Alexandre Duret-Lutz  <adl@gnu.org>
 
        * m4/python.m4 (AM_PATH_PYTHON): Make sure am_display_PYTHON is
index 77bc381..e4160c9 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 # install - install a program, script, or datafile
 
-scriptversion=2004-02-15.20
+scriptversion=2004-04-01.17
 
 # This originates from X11R5 (mit/util/scripts/install.sh), which was
 # later released in X11R6 (xc/config/util/install.sh) with the
@@ -280,26 +280,35 @@ do
       && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
       && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
 
-    # Now remove or move aside any old file at destination location.  We
-    # try this two ways since rm can't unlink itself on some systems and
-    # the destination file might be busy for other reasons.  In this case,
-    # the final cleanup might fail but the new file should still install
-    # successfully.
-    {
-      if test -f "$dstdir/$dstfile"; then
-        $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
-        || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
-        || {
-         echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
-         (exit 1); exit
-        }
-      else
-        :
-      fi
-    } &&
-
     # Now rename the file to the real destination.
-    $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
+    { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
+      || {
+          # The rename failed, perhaps because mv can't rename something else
+          # to itself, or perhaps because mv is so ancient that it does not
+          # support -f.
+
+          # Now remove or move aside any old file at destination location.
+          # We try this two ways since rm can't unlink itself on some
+          # systems and the destination file might be busy for other
+          # reasons.  In this case, the final cleanup might fail but the new
+          # file should still install successfully.
+          {
+            if test -f "$dstdir/$dstfile"; then
+              $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
+              || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
+              || {
+                echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
+                (exit 1); exit
+              }
+            else
+              :
+            fi
+          } &&
+
+          # Now rename the file to the real destination.
+          $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
+        }
+    }
   fi || { (exit 1); exit; }
 done