# 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