Mercurial > public > mercurial-scm > hg
comparison mercurial/commands.py @ 2042:a514c7509fa9
small changes to revert command.
fix bug 93: work with files that are in target manifest but not
dirstate.
author | Vadim Gelfer <vadim.gelfer@gmail.com> |
---|---|
date | Mon, 03 Apr 2006 10:02:09 -0700 |
parents | f90513a3dbcd |
children | 968f036f93a4 74d3f5336b66 |
comparison
equal
deleted
inserted
replaced
2041:077a2da7f1de | 2042:a514c7509fa9 |
---|---|
46 def makewalk(repo, pats, opts, node=None, head='', badmatch=None): | 46 def makewalk(repo, pats, opts, node=None, head='', badmatch=None): |
47 files, matchfn, anypats = matchpats(repo, pats, opts, head) | 47 files, matchfn, anypats = matchpats(repo, pats, opts, head) |
48 exact = dict(zip(files, files)) | 48 exact = dict(zip(files, files)) |
49 def walk(): | 49 def walk(): |
50 for src, fn in repo.walk(node=node, files=files, match=matchfn, | 50 for src, fn in repo.walk(node=node, files=files, match=matchfn, |
51 badmatch=None): | 51 badmatch=badmatch): |
52 yield src, fn, util.pathto(repo.getcwd(), fn), fn in exact | 52 yield src, fn, util.pathto(repo.getcwd(), fn), fn in exact |
53 return files, matchfn, walk() | 53 return files, matchfn, walk() |
54 | 54 |
55 def walk(repo, pats, opts, node=None, head='', badmatch=None): | 55 def walk(repo, pats, opts, node=None, head='', badmatch=None): |
56 files, matchfn, results = makewalk(repo, pats, opts, node, head, badmatch) | 56 files, matchfn, results = makewalk(repo, pats, opts, node, head, badmatch) |
2347 node = opts['rev'] and repo.lookup(opts['rev']) or parent | 2347 node = opts['rev'] and repo.lookup(opts['rev']) or parent |
2348 mf = repo.manifest.read(repo.changelog.read(node)[0]) | 2348 mf = repo.manifest.read(repo.changelog.read(node)[0]) |
2349 | 2349 |
2350 wlock = repo.wlock() | 2350 wlock = repo.wlock() |
2351 | 2351 |
2352 entries = [] | 2352 # need all matching names in dirstate and manifest of target rev, |
2353 # so have to walk both. do not print errors if files exist in one | |
2354 # but not other. | |
2355 | |
2353 names = {} | 2356 names = {} |
2357 target_only = {} | |
2358 | |
2359 # walk dirstate. | |
2360 | |
2354 for src, abs, rel, exact in walk(repo, pats, opts, badmatch=mf.has_key): | 2361 for src, abs, rel, exact in walk(repo, pats, opts, badmatch=mf.has_key): |
2355 names[abs] = True | 2362 names[abs] = (rel, exact) |
2356 entries.append((abs, rel, exact)) | 2363 if src == 'b': |
2364 target_only[abs] = True | |
2365 | |
2366 # walk target manifest. | |
2367 | |
2368 for src, abs, rel, exact in walk(repo, pats, opts, node=node, | |
2369 badmatch=names.has_key): | |
2370 if abs in names: continue | |
2371 names[abs] = (rel, exact) | |
2372 target_only[abs] = True | |
2357 | 2373 |
2358 changes = repo.changes(match=names.has_key, wlock=wlock) | 2374 changes = repo.changes(match=names.has_key, wlock=wlock) |
2359 modified, added, removed, deleted, unknown = map(dict.fromkeys, changes) | 2375 modified, added, removed, deleted, unknown = map(dict.fromkeys, changes) |
2360 | 2376 |
2361 revert = ([], _('reverting %s\n')) | 2377 revert = ([], _('reverting %s\n')) |
2375 (modified, revert, remove, True, True), | 2391 (modified, revert, remove, True, True), |
2376 (added, revert, forget, True, True), | 2392 (added, revert, forget, True, True), |
2377 (removed, undelete, None, False, False), | 2393 (removed, undelete, None, False, False), |
2378 (deleted, revert, remove, False, False), | 2394 (deleted, revert, remove, False, False), |
2379 (unknown, add, None, True, False), | 2395 (unknown, add, None, True, False), |
2396 (target_only, add, None, False, False), | |
2380 ) | 2397 ) |
2381 | 2398 |
2382 for abs, rel, exact in entries: | 2399 entries = names.items() |
2400 entries.sort() | |
2401 | |
2402 for abs, (rel, exact) in entries: | |
2403 in_mf = abs in mf | |
2383 def handle(xlist, dobackup): | 2404 def handle(xlist, dobackup): |
2384 xlist[0].append(abs) | 2405 xlist[0].append(abs) |
2385 if dobackup and not opts['no_backup'] and os.path.exists(rel): | 2406 if dobackup and not opts['no_backup'] and os.path.exists(rel): |
2386 bakname = "%s.orig" % rel | 2407 bakname = "%s.orig" % rel |
2387 ui.note(_('saving current version of %s as %s\n') % | 2408 ui.note(_('saving current version of %s as %s\n') % |
2391 if ui.verbose or not exact: | 2412 if ui.verbose or not exact: |
2392 ui.status(xlist[1] % rel) | 2413 ui.status(xlist[1] % rel) |
2393 for table, hitlist, misslist, backuphit, backupmiss in disptable: | 2414 for table, hitlist, misslist, backuphit, backupmiss in disptable: |
2394 if abs not in table: continue | 2415 if abs not in table: continue |
2395 # file has changed in dirstate | 2416 # file has changed in dirstate |
2396 if abs in mf: | 2417 if in_mf: |
2397 handle(hitlist, backuphit) | 2418 handle(hitlist, backuphit) |
2398 elif misslist is not None: | 2419 elif misslist is not None: |
2399 handle(misslist, backupmiss) | 2420 handle(misslist, backupmiss) |
2400 else: | 2421 else: |
2401 if exact: ui.warn(_('file not managed: %s\n' % rel)) | 2422 if exact: ui.warn(_('file not managed: %s\n' % rel)) |
2403 else: | 2424 else: |
2404 # file has not changed in dirstate | 2425 # file has not changed in dirstate |
2405 if node == parent: | 2426 if node == parent: |
2406 if exact: ui.warn(_('no changes needed to %s\n' % rel)) | 2427 if exact: ui.warn(_('no changes needed to %s\n' % rel)) |
2407 continue | 2428 continue |
2408 if abs not in mf: | 2429 if not in_mf: |
2409 remove[0].append(abs) | 2430 handle(remove, False) |
2410 update[abs] = True | 2431 update[abs] = True |
2411 | 2432 |
2412 repo.dirstate.forget(forget[0]) | 2433 repo.dirstate.forget(forget[0]) |
2413 r = repo.update(node, False, True, update.has_key, False, wlock=wlock) | 2434 r = repo.update(node, False, True, update.has_key, False, wlock=wlock) |
2414 repo.dirstate.update(add[0], 'a') | 2435 repo.dirstate.update(add[0], 'a') |