comparison hgext/purge.py @ 8043:b777dd8f7836

purge: remove read-only files under Windows (issue583) Initial version by Benoit Boissinot <bboissin@gmail.com>
author Patrick Mezard <pmezard@gmail.com>
date Fri, 10 Apr 2009 21:20:28 +0200
parents e2c55c4a25e2
children c1e2b7407dc3
comparison
equal deleted inserted replaced
8042:fd35e9d72879 8043:b777dd8f7836
27 # along with this program; if not, write to the Free Software 27 # along with this program; if not, write to the Free Software
28 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 28 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
29 29
30 from mercurial import util, commands, cmdutil 30 from mercurial import util, commands, cmdutil
31 from mercurial.i18n import _ 31 from mercurial.i18n import _
32 import os 32 import os, stat
33 33
34 def purge(ui, repo, *dirs, **opts): 34 def purge(ui, repo, *dirs, **opts):
35 '''removes files not tracked by Mercurial 35 '''removes files not tracked by Mercurial
36 36
37 Delete files not known to Mercurial. This is useful to test local 37 Delete files not known to Mercurial. This is useful to test local
70 raise util.Abort(m) 70 raise util.Abort(m)
71 ui.warn(_('warning: %s\n') % m) 71 ui.warn(_('warning: %s\n') % m)
72 else: 72 else:
73 ui.write('%s%s' % (name, eol)) 73 ui.write('%s%s' % (name, eol))
74 74
75 def removefile(path):
76 # read-only files cannot be unlinked under Windows
77 s = os.stat(path)
78 if (s.st_dev & stat.S_IWRITE) == 0:
79 os.chmod(path, s.st_mode | stat.S_IWRITE)
80 os.remove(path)
81
75 directories = [] 82 directories = []
76 match = cmdutil.match(repo, dirs, opts) 83 match = cmdutil.match(repo, dirs, opts)
77 match.dir = directories.append 84 match.dir = directories.append
78 status = repo.status(match=match, ignored=opts['all'], unknown=True) 85 status = repo.status(match=match, ignored=opts['all'], unknown=True)
79 86
80 for f in util.sort(status[4] + status[5]): 87 for f in util.sort(status[4] + status[5]):
81 ui.note(_('Removing file %s\n') % f) 88 ui.note(_('Removing file %s\n') % f)
82 remove(os.remove, f) 89 remove(removefile, f)
83 90
84 for f in util.sort(directories)[::-1]: 91 for f in util.sort(directories)[::-1]:
85 if match(f) and not os.listdir(repo.wjoin(f)): 92 if match(f) and not os.listdir(repo.wjoin(f)):
86 ui.note(_('Removing directory %s\n') % f) 93 ui.note(_('Removing directory %s\n') % f)
87 remove(os.rmdir, f) 94 remove(os.rmdir, f)