mercurial/commands.py
changeset 2407 8fe3d60b7f19
parent 2406 4a678e408ce5
child 2410 1e80d47b8581
equal deleted inserted replaced
2406:4a678e408ce5 2407:8fe3d60b7f19
  2324     elif p2 != nullid:
  2324     elif p2 != nullid:
  2325         raise util.Abort(_('working dir has two parents; '
  2325         raise util.Abort(_('working dir has two parents; '
  2326                            'you must specify the revision to revert to'))
  2326                            'you must specify the revision to revert to'))
  2327     else:
  2327     else:
  2328         node = parent
  2328         node = parent
  2329     pmf = None
       
  2330     mf = repo.manifest.read(repo.changelog.read(node)[0])
  2329     mf = repo.manifest.read(repo.changelog.read(node)[0])
       
  2330     if node == parent:
       
  2331         pmf = mf
       
  2332     else:
       
  2333         pmf = None
  2331 
  2334 
  2332     wlock = repo.wlock()
  2335     wlock = repo.wlock()
  2333 
  2336 
  2334     # need all matching names in dirstate and manifest of target rev,
  2337     # need all matching names in dirstate and manifest of target rev,
  2335     # so have to walk both. do not print errors if files exist in one
  2338     # so have to walk both. do not print errors if files exist in one
  2351                                      badmatch=names.has_key):
  2354                                      badmatch=names.has_key):
  2352         if abs in names: continue
  2355         if abs in names: continue
  2353         names[abs] = (rel, exact)
  2356         names[abs] = (rel, exact)
  2354         target_only[abs] = True
  2357         target_only[abs] = True
  2355 
  2358 
  2356     changes = repo.changes(node, match=names.has_key, wlock=wlock)
  2359     changes = repo.changes(match=names.has_key, wlock=wlock)
  2357     modified, added, removed, deleted, unknown = map(dict.fromkeys, changes)
  2360     modified, added, removed, deleted, unknown = map(dict.fromkeys, changes)
  2358 
  2361 
  2359     revert = ([], _('reverting %s\n'))
  2362     revert = ([], _('reverting %s\n'))
  2360     add = ([], _('adding %s\n'))
  2363     add = ([], _('adding %s\n'))
  2361     remove = ([], _('removing %s\n'))
  2364     remove = ([], _('removing %s\n'))
  2380 
  2383 
  2381     entries = names.items()
  2384     entries = names.items()
  2382     entries.sort()
  2385     entries.sort()
  2383 
  2386 
  2384     for abs, (rel, exact) in entries:
  2387     for abs, (rel, exact) in entries:
  2385         in_mf = abs in mf
  2388         mfentry = mf.get(abs)
  2386         def handle(xlist, dobackup):
  2389         def handle(xlist, dobackup):
  2387             xlist[0].append(abs)
  2390             xlist[0].append(abs)
       
  2391             update[abs] = 1
  2388             if dobackup and not opts['no_backup'] and os.path.exists(rel):
  2392             if dobackup and not opts['no_backup'] and os.path.exists(rel):
  2389                 bakname = "%s.orig" % rel
  2393                 bakname = "%s.orig" % rel
  2390                 ui.note(_('saving current version of %s as %s\n') %
  2394                 ui.note(_('saving current version of %s as %s\n') %
  2391                         (rel, bakname))
  2395                         (rel, bakname))
  2392                 shutil.copyfile(rel, bakname)
  2396                 shutil.copyfile(rel, bakname)
  2394             if ui.verbose or not exact:
  2398             if ui.verbose or not exact:
  2395                 ui.status(xlist[1] % rel)
  2399                 ui.status(xlist[1] % rel)
  2396         for table, hitlist, misslist, backuphit, backupmiss in disptable:
  2400         for table, hitlist, misslist, backuphit, backupmiss in disptable:
  2397             if abs not in table: continue
  2401             if abs not in table: continue
  2398             # file has changed in dirstate
  2402             # file has changed in dirstate
  2399             if in_mf:
  2403             if mfentry:
  2400                 handle(hitlist, backuphit)
  2404                 handle(hitlist, backuphit)
  2401             elif misslist is not None:
  2405             elif misslist is not None:
  2402                 handle(misslist, backupmiss)
  2406                 handle(misslist, backupmiss)
  2403             else:
  2407             else:
  2404                 if exact: ui.warn(_('file not managed: %s\n' % rel))
  2408                 if exact: ui.warn(_('file not managed: %s\n' % rel))
  2406         else:
  2410         else:
  2407             # file has not changed in dirstate
  2411             # file has not changed in dirstate
  2408             if node == parent:
  2412             if node == parent:
  2409                 if exact: ui.warn(_('no changes needed to %s\n' % rel))
  2413                 if exact: ui.warn(_('no changes needed to %s\n' % rel))
  2410                 continue
  2414                 continue
  2411             if not in_mf:
  2415             if pmf is None:
  2412                 if pmf is None:
  2416                 # only need parent manifest in this unlikely case,
  2413                     # only need parent manifest in this unlikely case,
  2417                 # so do not read by default
  2414                     # so do not read by default
  2418                 pmf = repo.manifest.read(repo.changelog.read(parent)[0])
  2415                     pmf = repo.manifest.read(repo.changelog.read(parent)[0])
  2419             if abs in pmf:
  2416                 if abs in pmf:
  2420                 if mfentry:
       
  2421                     # if version of file is same in parent and target
       
  2422                     # manifests, do nothing
       
  2423                     if pmf[abs] != mfentry:
       
  2424                         handle(revert, False)
       
  2425                 else:
  2417                     handle(remove, False)
  2426                     handle(remove, False)
  2418         update[abs] = True
       
  2419 
  2427 
  2420     repo.dirstate.forget(forget[0])
  2428     repo.dirstate.forget(forget[0])
  2421     r = repo.update(node, False, True, update.has_key, False, wlock=wlock,
  2429     r = repo.update(node, False, True, update.has_key, False, wlock=wlock,
  2422                     show_stats=False)
  2430                     show_stats=False)
  2423     repo.dirstate.update(add[0], 'a')
  2431     repo.dirstate.update(add[0], 'a')