--- a/hgext/purge.py Wed Nov 07 22:57:28 2007 +0100
+++ b/hgext/purge.py Fri Nov 09 20:21:35 2007 -0200
@@ -49,6 +49,9 @@
else:
ui.write('%s%s' % (name, eol))
+ if not force:
+ _check_fs(ui, repo)
+
directories = []
files = []
missing = []
@@ -63,8 +66,6 @@
elif src == 'f' and f not in repo.dirstate:
files.append(f)
- _check_missing(ui, repo, missing, force)
-
directories.sort()
for f in files:
@@ -77,7 +78,7 @@
ui.note(_('Removing directory %s\n') % f)
remove(os.rmdir, f)
-def _check_missing(ui, repo, missing, force=False):
+def _check_fs(ui, repo):
"""Abort if there is the chance of having problems with name-mangling fs
In a name mangling filesystem (e.g. a case insensitive one)
@@ -85,34 +86,18 @@
stored in the dirstate. This already confuses the status and
add commands, but with purge this may cause data loss.
- To prevent this, _check_missing will abort if there are missing
- files. The force option will let the user skip the check if he
- knows it is safe.
-
- Even with the force option this function will check if any of the
- missing files is still available in the working dir: if so there
- may be some problem with the underlying filesystem, so it
- aborts unconditionally."""
-
- found = [f for f in missing if util.lexists(repo.wjoin(f))]
+ To prevent this, this function will abort if there are uncommitted
+ changes.
+ """
- if found:
- if not ui.quiet:
- ui.warn(_("The following tracked files weren't listed by the "
- "filesystem, but could still be found:\n"))
- for f in found:
- ui.warn("%s\n" % f)
- if util.checkfolding(repo.path):
- ui.warn(_("This is probably due to a case-insensitive "
- "filesystem\n"))
- raise util.Abort(_("purging on name mangling filesystems is not "
- "yet fully supported"))
-
- if missing and not force:
- raise util.Abort(_("there are missing files in the working dir and "
- "purge still has problems with them due to name "
- "mangling filesystems. "
- "Use --force if you know what you are doing"))
+ # We can't use (files, match) to do a partial walk here - we wouldn't
+ # notice a modified README file if the user ran "hg purge readme"
+ modified, added, removed, deleted = repo.status()[:4]
+ if modified or added or removed or deleted:
+ if not util.checkfolding(repo.path) and not ui.quiet:
+ ui.warn(_("Purging on name mangling filesystems is not "
+ "fully supported.\n"))
+ raise util.Abort(_("outstanding uncommitted changes"))
def purge(ui, repo, *dirs, **opts):
@@ -158,7 +143,7 @@
(purge,
[('a', 'abort-on-err', None, _('abort if an error occurs')),
('', 'all', None, _('purge ignored files too')),
- ('f', 'force', None, _('purge even when missing files are detected')),
+ ('f', 'force', None, _('purge even when there are uncommitted changes')),
('p', 'print', None, _('print the file names instead of deleting them')),
('0', 'print0', None, _('end filenames with NUL, for use with xargs'
' (implies -p)')),