# HG changeset patch # User FUJIWARA Katsunori # Date 2015-04-10 15:47:09 # Node ID 144883a8d0d48b82e12024d067a07f23f5dd6587 # Parent def1145cec2d4d674a530b377375e6d719979a5a util: add removedirs as platform depending function According to fa901423ac23 introducing "windows._removedirs()": If a hg repository including working directory is a reparse point (directory symlinked or a junction point), then using os.removedirs will remove the reparse point erroneously. "windows._removedirs()" should be used instead of "os.removedirs()" on Windows. This patch adds "removedirs" as platform depending function to replace "os.removedirs()" invocations for portability and safety diff --git a/mercurial/posix.py b/mercurial/posix.py --- a/mercurial/posix.py +++ b/mercurial/posix.py @@ -16,6 +16,7 @@ samestat = os.path.samestat oslink = os.link unlink = os.unlink rename = os.rename +removedirs = os.removedirs expandglobs = False umask = os.umask(0) diff --git a/mercurial/util.py b/mercurial/util.py --- a/mercurial/util.py +++ b/mercurial/util.py @@ -59,6 +59,7 @@ posixfile = platform.posixfile quotecommand = platform.quotecommand readpipe = platform.readpipe rename = platform.rename +removedirs = platform.removedirs samedevice = platform.samedevice samefile = platform.samefile samestat = platform.samestat diff --git a/mercurial/windows.py b/mercurial/windows.py --- a/mercurial/windows.py +++ b/mercurial/windows.py @@ -270,7 +270,7 @@ def groupname(gid=None): If gid is None, return the name of the current group.""" return None -def _removedirs(name): +def removedirs(name): """special version of os.removedirs that does not remove symlinked directories or junction points if they actually contain files""" if osutil.listdir(name): @@ -297,7 +297,7 @@ def unlinkpath(f, ignoremissing=False): raise # try removing directories that might now be empty try: - _removedirs(os.path.dirname(f)) + removedirs(os.path.dirname(f)) except OSError: pass