mercurial/scmutil.py
branchstable
changeset 48315 a44bb185f6bd
parent 48036 1c447fb82232
parent 48105 207df24a31f6
child 48367 0b8e076e878c
equal deleted inserted replaced
48314:6f43569729d4 48315:a44bb185f6bd
   687     if not revspec and revspec != 0:
   687     if not revspec and revspec != 0:
   688         return repo[default]
   688         return repo[default]
   689 
   689 
   690     l = revrange(repo, [revspec], localalias=localalias)
   690     l = revrange(repo, [revspec], localalias=localalias)
   691     if not l:
   691     if not l:
   692         raise error.Abort(_(b'empty revision set'))
   692         raise error.InputError(_(b'empty revision set'))
   693     return repo[l.last()]
   693     return repo[l.last()]
   694 
   694 
   695 
   695 
   696 def _pairspec(revspec):
   696 def _pairspec(revspec):
   697     tree = revsetlang.parse(revspec)
   697     tree = revsetlang.parse(revspec)
   708         return repo[b'.'], repo[None]
   708         return repo[b'.'], repo[None]
   709 
   709 
   710     l = revrange(repo, revs)
   710     l = revrange(repo, revs)
   711 
   711 
   712     if not l:
   712     if not l:
   713         raise error.Abort(_(b'empty revision range'))
   713         raise error.InputError(_(b'empty revision range'))
   714 
   714 
   715     first = l.first()
   715     first = l.first()
   716     second = l.last()
   716     second = l.last()
   717 
   717 
   718     if (
   718     if (
   719         first == second
   719         first == second
   720         and len(revs) >= 2
   720         and len(revs) >= 2
   721         and not all(revrange(repo, [r]) for r in revs)
   721         and not all(revrange(repo, [r]) for r in revs)
   722     ):
   722     ):
   723         raise error.Abort(_(b'empty revision on one side of range'))
   723         raise error.InputError(_(b'empty revision on one side of range'))
   724 
   724 
   725     # if top-level is range expression, the result must always be a pair
   725     # if top-level is range expression, the result must always be a pair
   726     if first == second and len(revs) == 1 and not _pairspec(revs[0]):
   726     if first == second and len(revs) == 1 and not _pairspec(revs[0]):
   727         return repo[first], repo[None]
   727         return repo[first], repo[None]
   728 
   728 
  1209     m = matcher
  1209     m = matcher
  1210     dry_run = opts.get(b'dry_run')
  1210     dry_run = opts.get(b'dry_run')
  1211     try:
  1211     try:
  1212         similarity = float(opts.get(b'similarity') or 0)
  1212         similarity = float(opts.get(b'similarity') or 0)
  1213     except ValueError:
  1213     except ValueError:
  1214         raise error.Abort(_(b'similarity must be a number'))
  1214         raise error.InputError(_(b'similarity must be a number'))
  1215     if similarity < 0 or similarity > 100:
  1215     if similarity < 0 or similarity > 100:
  1216         raise error.Abort(_(b'similarity must be between 0 and 100'))
  1216         raise error.InputError(_(b'similarity must be between 0 and 100'))
  1217     similarity /= 100.0
  1217     similarity /= 100.0
  1218 
  1218 
  1219     ret = 0
  1219     ret = 0
  1220 
  1220 
  1221     wctx = repo[None]
  1221     wctx = repo[None]
  1325         unknown=True,
  1325         unknown=True,
  1326         ignored=False,
  1326         ignored=False,
  1327         full=False,
  1327         full=False,
  1328     )
  1328     )
  1329     for abs, st in pycompat.iteritems(walkresults):
  1329     for abs, st in pycompat.iteritems(walkresults):
  1330         dstate = dirstate[abs]
  1330         entry = dirstate.get_entry(abs)
  1331         if dstate == b'?' and audit_path.check(abs):
  1331         if (not entry.any_tracked) and audit_path.check(abs):
  1332             unknown.append(abs)
  1332             unknown.append(abs)
  1333         elif dstate != b'r' and not st:
  1333         elif (not entry.removed) and not st:
  1334             deleted.append(abs)
  1334             deleted.append(abs)
  1335         elif dstate == b'r' and st:
  1335         elif entry.removed and st:
  1336             forgotten.append(abs)
  1336             forgotten.append(abs)
  1337         # for finding renames
  1337         # for finding renames
  1338         elif dstate == b'r' and not st:
  1338         elif entry.removed and not st:
  1339             removed.append(abs)
  1339             removed.append(abs)
  1340         elif dstate == b'a':
  1340         elif entry.added:
  1341             added.append(abs)
  1341             added.append(abs)
  1342 
  1342 
  1343     return added, unknown, deleted, removed, forgotten
  1343     return added, unknown, deleted, removed, forgotten
  1344 
  1344 
  1345 
  1345 
  1453     """Update the dirstate to reflect the intent of copying src to dst. For
  1453     """Update the dirstate to reflect the intent of copying src to dst. For
  1454     different reasons it might not end with dst being marked as copied from src.
  1454     different reasons it might not end with dst being marked as copied from src.
  1455     """
  1455     """
  1456     origsrc = repo.dirstate.copied(src) or src
  1456     origsrc = repo.dirstate.copied(src) or src
  1457     if dst == origsrc:  # copying back a copy?
  1457     if dst == origsrc:  # copying back a copy?
  1458         if repo.dirstate[dst] not in b'mn' and not dryrun:
  1458         entry = repo.dirstate.get_entry(dst)
       
  1459         if (entry.added or not entry.tracked) and not dryrun:
  1459             repo.dirstate.set_tracked(dst)
  1460             repo.dirstate.set_tracked(dst)
  1460     else:
  1461     else:
  1461         if repo.dirstate[origsrc] == b'a' and origsrc == src:
  1462         if repo.dirstate.get_entry(origsrc).added and origsrc == src:
  1462             if not ui.quiet:
  1463             if not ui.quiet:
  1463                 ui.warn(
  1464                 ui.warn(
  1464                     _(
  1465                     _(
  1465                         b"%s has not been committed yet, so no copy "
  1466                         b"%s has not been committed yet, so no copy "
  1466                         b"data will be stored for %s.\n"
  1467                         b"data will be stored for %s.\n"
  1467                     )
  1468                     )
  1468                     % (repo.pathto(origsrc, cwd), repo.pathto(dst, cwd))
  1469                     % (repo.pathto(origsrc, cwd), repo.pathto(dst, cwd))
  1469                 )
  1470                 )
  1470             if repo.dirstate[dst] in b'?r' and not dryrun:
  1471             if not repo.dirstate.get_entry(dst).tracked and not dryrun:
  1471                 wctx.add([dst])
  1472                 wctx.add([dst])
  1472         elif not dryrun:
  1473         elif not dryrun:
  1473             wctx.copy(origsrc, dst)
  1474             wctx.copy(origsrc, dst)
  1474 
  1475 
  1475 
  1476 
  1502         dst: oldcopies.get(src, src)
  1503         dst: oldcopies.get(src, src)
  1503         for dst, src in pycompat.iteritems(oldcopies)
  1504         for dst, src in pycompat.iteritems(oldcopies)
  1504     }
  1505     }
  1505     # Adjust the dirstate copies
  1506     # Adjust the dirstate copies
  1506     for dst, src in pycompat.iteritems(copies):
  1507     for dst, src in pycompat.iteritems(copies):
  1507         if src not in newctx or dst in newctx or ds[dst] != b'a':
  1508         if src not in newctx or dst in newctx or not ds.get_entry(dst).added:
  1508             src = None
  1509             src = None
  1509         ds.copy(src, dst)
  1510         ds.copy(src, dst)
  1510     repo._quick_access_changeid_invalidate()
  1511     repo._quick_access_changeid_invalidate()
  1511 
  1512 
  1512 
  1513