Mercurial > hg-stable
diff mercurial/commands.py @ 15474:95174c381525
forget: support forgetting explicit paths in subrepos
Change the behavior of the forget command such that explicit paths in
subrepos are handled by forgetting the file in the subrepo. This eliminates the
previous behavior where if you called "hg forget" for an explicit path in a
subrepo, it would state that the file is already untracked.
author | David M. Carr <david@carrclan.us> |
---|---|
date | Wed, 09 Nov 2011 19:46:51 -0500 |
parents | f520c9616db5 |
children | 875bb46e35ea |
line wrap: on
line diff
--- 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(