Mercurial > hg
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) |