# HG changeset patch
# User Stanislau Hlebik <st...@fb.com>
# Date 1472496038 25200
#      Mon Aug 29 11:40:38 2016 -0700
# Node ID e1962781ce84040746ef79c0084b8fd70cfcd4b4
# Parent  318e2b600b80e4ed3c6f37df46ec7544f60d4c0b
update: do not remove cwd

During update directories are deleted as soon as they have no entries.
But current working directory shouldn't be deleted because it
causes problems for users after hg finishes. Also it makes complex commands
like 'hg split' fail.

diff --git a/mercurial/merge.py b/mercurial/merge.py
--- a/mercurial/merge.py
+++ b/mercurial/merge.py
@@ -1043,7 +1043,7 @@
             repo.ui.note(_("removing %s\n") % f)
         audit(f)
         try:
-            unlink(wjoin(f), ignoremissing=True)
+            unlink(wjoin(f), ignoremissing=True, donotremovecwd=True)
         except OSError as inst:
             repo.ui.warn(_("update failed to remove %s: %s!\n") %
                          (f, inst.strerror))
diff --git a/mercurial/posix.py b/mercurial/posix.py
--- a/mercurial/posix.py
+++ b/mercurial/posix.py
@@ -23,6 +23,7 @@
 from .i18n import _
 from . import (
     encoding,
+    osutil,
 )
 
 posixfile = open
@@ -496,7 +497,31 @@
 def makedir(path, notindexed):
     os.mkdir(path)
 
-def unlinkpath(f, ignoremissing=False):
+def removedirs(name, donotremovecwd=False):
+    """special version of os.removedirs that does not remove symlinked
+    directories or junction points if they actually contain files"""
+    if not donotremovecwd:
+        return os.removedirs(name)
+
+    cwd = os.getcwd()
+    if cwd == name:
+        return
+    if osutil.listdir(name):
+        return
+    os.rmdir(name)
+    head, tail = os.path.split(name)
+    if not tail:
+        head, tail = os.path.split(head)
+    while head and tail:
+        try:
+            if osutil.listdir(head) or cwd == head:
+                return
+            os.rmdir(head)
+        except (ValueError, OSError):
+            break
+        head, tail = os.path.split(head)
+
+def unlinkpath(f, ignoremissing=False, donotremovecwd=False):
     """unlink and remove the directory if it is empty"""
     try:
         os.unlink(f)
@@ -505,7 +530,7 @@
             raise
     # try removing directories that might now be empty
     try:
-        os.removedirs(os.path.dirname(f))
+        removedirs(os.path.dirname(f), donotremovecwd)
     except OSError:
         pass
 
diff --git a/mercurial/windows.py b/mercurial/windows.py
--- a/mercurial/windows.py
+++ b/mercurial/windows.py
@@ -369,11 +369,14 @@
     If gid is None, return the name of the current group."""
     return None
 
-def removedirs(name):
+def removedirs(name, donotremovecwd=False):
     """special version of os.removedirs that does not remove symlinked
     directories or junction points if they actually contain files"""
     if osutil.listdir(name):
         return
+    cwd = os.getcwd()
+    if donotremovecwd and cwd == name:
+        return
     os.rmdir(name)
     head, tail = os.path.split(name)
     if not tail:
@@ -382,12 +385,14 @@
         try:
             if osutil.listdir(head):
                 return
+            if donotremovecwd and cwd == head:
+                return
             os.rmdir(head)
         except (ValueError, OSError):
             break
         head, tail = os.path.split(head)
 
-def unlinkpath(f, ignoremissing=False):
+def unlinkpath(f, ignoremissing=False, donotremovecwd=False):
     """unlink and remove the directory if it is empty"""
     try:
         unlink(f)
@@ -396,7 +401,7 @@
             raise
     # try removing directories that might now be empty
     try:
-        removedirs(os.path.dirname(f))
+        removedirs(os.path.dirname(f), donotremovecwd)
     except OSError:
         pass
 
diff --git a/tests/test-update-names.t b/tests/test-update-names.t
--- a/tests/test-update-names.t
+++ b/tests/test-update-names.t
@@ -72,3 +72,13 @@
   $ cd ..
 
 #endif
+
+Test that cwd is not deleted during update
+  $ hg init r4 && cd r4
+  $ mkdir dir
+  $ cd dir
+  $ echo a > a
+  $ hg add a
+  $ hg ci -m "file and dir"
+  $ hg up -q null
+  $ cd .
_______________________________________________
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel

Reply via email to