scmutil: don't try to delete origbackup symlinks to directories (issue5731) stable
authorMark Thomas <mbthomas@fb.com>
Fri, 03 Nov 2017 09:27:36 -0700
branchstable
changeset 35009 99ab7bc944d2
parent 35008 ad671b4cb9fc
child 35013 36507048da0f
child 35021 b69c700b6de6
child 35110 3f2e49d9802e
scmutil: don't try to delete origbackup symlinks to directories (issue5731) When origbackuppath is set, when looking to see if a file we are backing up conflicts with a directory in the origbackuppath, we incorrectly match on symlinks to directories. This means we try to call vfs.rmtree on the symlink, which fails. Differential Revision: https://phab.mercurial-scm.org/D1311
mercurial/scmutil.py
tests/test-origbackup-conflict.t
--- a/mercurial/scmutil.py	Fri Nov 03 09:27:35 2017 -0700
+++ b/mercurial/scmutil.py	Fri Nov 03 09:27:36 2017 -0700
@@ -610,7 +610,7 @@
 
         origvfs.makedirs(origbackupdir)
 
-    if origvfs.isdir(filepathfromroot):
+    if origvfs.isdir(filepathfromroot) and not origvfs.islink(filepathfromroot):
         ui.note(_('removing conflicting directory: %s\n')
                 % origvfs.join(filepathfromroot))
         origvfs.rmtree(filepathfromroot, forcibly=True)
--- a/tests/test-origbackup-conflict.t	Fri Nov 03 09:27:35 2017 -0700
+++ b/tests/test-origbackup-conflict.t	Fri Nov 03 09:27:36 2017 -0700
@@ -110,18 +110,12 @@
   creating directory: $TESTTMP/repo/.hg/origbackups/b (glob)
   removing conflicting file: $TESTTMP/repo/.hg/origbackups/b (glob)
   getting d
-  removing conflicting directory: $TESTTMP/repo/.hg/origbackups/d (glob)
-  abort: None
-  [255]
-
-Workaround issue by deleting d:
-
-  $ rm d
-  $ hg up c1
   2 files updated, 0 files merged, 0 files removed, 0 files unresolved
   (activating bookmark c1)
   $ cat .hg/origbackups/b/c
   c4
+  $ cat .hg/origbackups/d
+  d3
   $ ls ../sym-link-target
 
 Incorrectly configure origbackuppath to be under a file