--- a/mercurial/commands.py Wed Nov 09 19:46:49 2011 -0500
+++ b/mercurial/commands.py Wed Nov 09 19:46:51 2011 -0500
@@ -13,6 +13,7 @@
import patch, help, url, encoding, templatekw, discovery
import archival, changegroup, cmdutil, hbisect
import sshserver, hgweb, hgweb.server, commandserver
+import match as matchmod
import merge as mergemod
import minirst, revset, fileset
import dagparser, context, simplemerge
@@ -2432,23 +2433,45 @@
if not pats:
raise util.Abort(_('no files specified'))
- m = scmutil.match(repo[None], pats, opts)
+ wctx = repo[None]
+ m = scmutil.match(wctx, pats, opts)
s = repo.status(match=m, clean=True)
forget = sorted(s[0] + s[1] + s[3] + s[6])
+ subforget = {}
errs = 0
+ for subpath in wctx.substate:
+ sub = wctx.sub(subpath)
+ try:
+ submatch = matchmod.narrowmatcher(subpath, m)
+ for fsub in sub.walk(submatch):
+ if submatch.exact(fsub):
+ subforget[os.path.join(subpath, fsub)] = (fsub, sub)
+ except error.LookupError:
+ ui.status(_("skipping missing subrepository: %s\n") % subpath)
+
for f in m.files():
if f not in repo.dirstate and not os.path.isdir(m.rel(f)):
- if os.path.exists(m.rel(f)):
- ui.warn(_('not removing %s: file is already untracked\n')
- % m.rel(f))
- errs = 1
+ if f not in subforget:
+ if os.path.exists(m.rel(f)):
+ ui.warn(_('not removing %s: file is already untracked\n')
+ % m.rel(f))
+ errs = 1
for f in forget:
if ui.verbose or not m.exact(f):
ui.status(_('removing %s\n') % m.rel(f))
- repo[None].forget(forget)
+ if ui.verbose:
+ for f in sorted(subforget.keys()):
+ ui.status(_('removing %s\n') % m.rel(f))
+
+ wctx.forget(forget)
+
+ for f in sorted(subforget.keys()):
+ fsub, sub = subforget[f]
+ sub.forget([fsub])
+
return errs
@command(