diff --git a/hgext/purge.py b/hgext/purge.py --- a/hgext/purge.py +++ b/hgext/purge.py @@ -73,11 +73,15 @@ def purge(ui, repo, *dirs, **opts): ui.write('%s%s' % (name, eol)) def removefile(path): - # read-only files cannot be unlinked under Windows - s = os.stat(path) - if (s.st_dev & stat.S_IWRITE) == 0: - os.chmod(path, s.st_mode | stat.S_IWRITE) - os.remove(path) + try: + os.remove(path) + except OSError: + # read-only files cannot be unlinked under Windows + s = os.stat(path) + if (s.st_mode & stat.S_IWRITE) != 0: + raise + os.chmod(path, stat.S_IMODE(s.st_mode) | stat.S_IWRITE) + os.remove(path) directories = [] match = cmdutil.match(repo, dirs, opts) diff --git a/tests/test-purge b/tests/test-purge --- a/tests/test-purge +++ b/tests/test-purge @@ -38,7 +38,7 @@ touch untracked_file_readonly python <