mercurial/cmdutil.py
changeset 23289 ae5d0a22ee7e
parent 23258 10697f29af2b
child 23325 4165cfd67519
--- a/mercurial/cmdutil.py	Tue Nov 11 20:08:19 2014 -0800
+++ b/mercurial/cmdutil.py	Sun Nov 09 12:31:34 2014 -0500
@@ -2052,6 +2052,59 @@
     forgot.extend(forget)
     return bad, forgot
 
+def remove(ui, repo, m, after, force):
+    ret = 0
+    s = repo.status(match=m, clean=True)
+    modified, added, deleted, clean = s[0], s[1], s[3], s[6]
+
+    # warn about failure to delete explicit files/dirs
+    wctx = repo[None]
+    for f in m.files():
+        if f in repo.dirstate or f in wctx.dirs():
+            continue
+        if os.path.exists(m.rel(f)):
+            if os.path.isdir(m.rel(f)):
+                ui.warn(_('not removing %s: no tracked files\n') % m.rel(f))
+            else:
+                ui.warn(_('not removing %s: file is untracked\n') % m.rel(f))
+        # missing files will generate a warning elsewhere
+        ret = 1
+
+    if force:
+        list = modified + deleted + clean + added
+    elif after:
+        list = deleted
+        for f in modified + added + clean:
+            ui.warn(_('not removing %s: file still exists\n') % m.rel(f))
+            ret = 1
+    else:
+        list = deleted + clean
+        for f in modified:
+            ui.warn(_('not removing %s: file is modified (use -f'
+                      ' to force removal)\n') % m.rel(f))
+            ret = 1
+        for f in added:
+            ui.warn(_('not removing %s: file has been marked for add'
+                      ' (use forget to undo)\n') % m.rel(f))
+            ret = 1
+
+    for f in sorted(list):
+        if ui.verbose or not m.exact(f):
+            ui.status(_('removing %s\n') % m.rel(f))
+
+    wlock = repo.wlock()
+    try:
+        if not after:
+            for f in list:
+                if f in added:
+                    continue # we never unlink added files on remove
+                util.unlinkpath(repo.wjoin(f), ignoremissing=True)
+        repo[None].forget(list)
+    finally:
+        wlock.release()
+
+    return ret
+
 def cat(ui, repo, ctx, matcher, prefix, **opts):
     err = 1