comparison mercurial/cmdutil.py @ 15912:2bd54ffaa27e

forget: fix subrepo recursion for explicit path handling When support for handling explicit paths in subrepos was added to the forget command (95174c381525), subrepo recursion wasn't taken into account. This change fixes that by pulling the majority of the logic of commands.forget into cmdutil.forget, which can then be called from both there and subrepo.forget.
author David M. Carr <david@carrclan.us>
date Tue, 17 Jan 2012 19:10:59 -0500
parents c654eac03452
children f11eee00c652
comparison
equal deleted inserted replaced
15911:c654eac03452 15912:2bd54ffaa27e
1199 if not dryrun: 1199 if not dryrun:
1200 rejected = wctx.add(names, prefix) 1200 rejected = wctx.add(names, prefix)
1201 bad.extend(f for f in rejected if f in match.files()) 1201 bad.extend(f for f in rejected if f in match.files())
1202 return bad 1202 return bad
1203 1203
1204 def forget(ui, repo, match, prefix, explicitonly):
1205 join = lambda f: os.path.join(prefix, f)
1206 bad = []
1207 oldbad = match.bad
1208 match.bad = lambda x, y: bad.append(x) or oldbad(x, y)
1209 wctx = repo[None]
1210 forgot = []
1211 s = repo.status(match=match, clean=True)
1212 forget = sorted(s[0] + s[1] + s[3] + s[6])
1213 if explicitonly:
1214 forget = [f for f in forget if match.exact(f)]
1215
1216 for subpath in wctx.substate:
1217 sub = wctx.sub(subpath)
1218 try:
1219 submatch = matchmod.narrowmatcher(subpath, match)
1220 subbad, subforgot = sub.forget(ui, submatch, prefix)
1221 bad.extend([subpath + '/' + f for f in subbad])
1222 forgot.extend([subpath + '/' + f for f in subforgot])
1223 except error.LookupError:
1224 ui.status(_("skipping missing subrepository: %s\n")
1225 % join(subpath))
1226
1227 for f in match.files():
1228 if match.exact(f) or not explicitonly:
1229 if f not in repo.dirstate and not os.path.isdir(match.rel(join(f))):
1230 if f not in forgot:
1231 if os.path.exists(match.rel(join(f))):
1232 ui.warn(_('not removing %s: '
1233 'file is already untracked\n')
1234 % match.rel(join(f)))
1235 bad.append(f)
1236
1237 for f in forget:
1238 if ui.verbose or not match.exact(f):
1239 ui.status(_('removing %s\n') % match.rel(join(f)))
1240
1241 rejected = wctx.forget(forget, prefix)
1242 bad.extend(f for f in rejected if f in match.files())
1243 forgot.extend(forget)
1244 return bad, forgot
1245
1204 def duplicatecopies(repo, rev, p1): 1246 def duplicatecopies(repo, rev, p1):
1205 "Reproduce copies found in the source revision in the dirstate for grafts" 1247 "Reproduce copies found in the source revision in the dirstate for grafts"
1206 for dst, src in copies.pathcopies(repo[p1], repo[rev]).iteritems(): 1248 for dst, src in copies.pathcopies(repo[p1], repo[rev]).iteritems():
1207 repo.dirstate.copy(src, dst) 1249 repo.dirstate.copy(src, dst)
1208 1250