##// END OF EJS Templates
revlog: reachable actually takes a node
revlog: reachable actually takes a node

File last commit:

r3531:730ca93e default
r3630:50803629 default
Show More
cmdutil.py
197 lines | 7.1 KiB | text/x-python | PythonLexer
Vadim Gelfer
fix comment.
r2957 # cmdutil.py - help for command processing in mercurial
Vadim Gelfer
refactor text diff/patch code....
r2874 #
# Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
#
# This software may be used and distributed according to the terms
# of the GNU General Public License, incorporated herein by reference.
from demandload import demandload
from node import *
from i18n import gettext as _
Vadim Gelfer
addremove: add -s/--similarity option...
r2958 demandload(globals(), 'mdiff util')
Vadim Gelfer
refactor text diff/patch code....
r2874 demandload(globals(), 'os sys')
Brendan Cully
Move revision parsing into cmdutil.
r3090 revrangesep = ':'
def revpair(ui, repo, revs):
'''return pair of nodes, given list of revisions. second item can
be None, meaning use working dir.'''
Matt Mackall
simplify revrange and revpair
r3525
def revfix(repo, val, defval):
if not val and val != 0:
val = defval
return repo.lookup(val)
Brendan Cully
Move revision parsing into cmdutil.
r3090 if not revs:
return repo.dirstate.parents()[0], None
end = None
if len(revs) == 1:
Matt Mackall
simplify revrange and revpair
r3525 if revrangesep in revs[0]:
start, end = revs[0].split(revrangesep, 1)
Brendan Cully
Move revision parsing into cmdutil.
r3090 start = revfix(repo, start, 0)
end = revfix(repo, end, repo.changelog.count() - 1)
else:
Matt Mackall
simplify revrange and revpair
r3525 start = revfix(repo, revs[0], None)
Brendan Cully
Move revision parsing into cmdutil.
r3090 elif len(revs) == 2:
if revrangesep in revs[0] or revrangesep in revs[1]:
raise util.Abort(_('too many revisions specified'))
start = revfix(repo, revs[0], None)
end = revfix(repo, revs[1], None)
else:
raise util.Abort(_('too many revisions specified'))
Matt Mackall
simplify revrange and revpair
r3525 return start, end
Brendan Cully
Move revision parsing into cmdutil.
r3090
def revrange(ui, repo, revs):
"""Yield revision as strings from a list of revision specifications."""
Matt Mackall
simplify revrange and revpair
r3525
def revfix(repo, val, defval):
if not val and val != 0:
return defval
return repo.changelog.rev(repo.lookup(val))
Matt Mackall
Make revrange return a list of ints so that callers don't have to convert
r3526 seen, l = {}, []
Brendan Cully
Move revision parsing into cmdutil.
r3090 for spec in revs:
if revrangesep in spec:
start, end = spec.split(revrangesep, 1)
start = revfix(repo, start, 0)
end = revfix(repo, end, repo.changelog.count() - 1)
step = start > end and -1 or 1
for rev in xrange(start, end+step, step):
if rev in seen:
continue
seen[rev] = 1
Matt Mackall
Make revrange return a list of ints so that callers don't have to convert
r3526 l.append(rev)
Brendan Cully
Move revision parsing into cmdutil.
r3090 else:
rev = revfix(repo, spec, None)
if rev in seen:
continue
seen[rev] = 1
Matt Mackall
Make revrange return a list of ints so that callers don't have to convert
r3526 l.append(rev)
return l
Brendan Cully
Move revision parsing into cmdutil.
r3090
Vadim Gelfer
refactor text diff/patch code....
r2874 def make_filename(repo, pat, node,
total=None, seqno=None, revwidth=None, pathname=None):
node_expander = {
'H': lambda: hex(node),
'R': lambda: str(repo.changelog.rev(node)),
'h': lambda: short(node),
}
expander = {
'%': lambda: '%',
'b': lambda: os.path.basename(repo.root),
}
try:
if node:
expander.update(node_expander)
if node and revwidth is not None:
expander['r'] = (lambda:
str(repo.changelog.rev(node)).zfill(revwidth))
if total is not None:
expander['N'] = lambda: str(total)
if seqno is not None:
expander['n'] = lambda: str(seqno)
if total is not None and seqno is not None:
expander['n'] = lambda:str(seqno).zfill(len(str(total)))
if pathname is not None:
expander['s'] = lambda: os.path.basename(pathname)
expander['d'] = lambda: os.path.dirname(pathname) or '.'
expander['p'] = lambda: pathname
newname = []
patlen = len(pat)
i = 0
while i < patlen:
c = pat[i]
if c == '%':
i += 1
c = pat[i]
c = expander[c]()
newname.append(c)
i += 1
return ''.join(newname)
except KeyError, inst:
Thomas Arendsen Hein
Never apply string formatting to generated errors with util.Abort....
r3072 raise util.Abort(_("invalid format spec '%%%s' in output file name") %
inst.args[0])
Vadim Gelfer
refactor text diff/patch code....
r2874
def make_file(repo, pat, node=None,
total=None, seqno=None, revwidth=None, mode='wb', pathname=None):
if not pat or pat == '-':
return 'w' in mode and sys.stdout or sys.stdin
if hasattr(pat, 'write') and 'w' in mode:
return pat
if hasattr(pat, 'read') and 'r' in mode:
return pat
return open(make_filename(repo, pat, node, total, seqno, revwidth,
pathname),
mode)
Vadim Gelfer
move walk and matchpats from commands to cmdutil.
r2882
def matchpats(repo, pats=[], opts={}, head=''):
cwd = repo.getcwd()
if not pats and cwd:
Vadim Gelfer
cmdutil.matchpats: allow include/exclude to be optional.
r2885 opts['include'] = [os.path.join(cwd, i)
for i in opts.get('include', [])]
opts['exclude'] = [os.path.join(cwd, x)
for x in opts.get('exclude', [])]
Vadim Gelfer
move walk and matchpats from commands to cmdutil.
r2882 cwd = ''
return util.cmdmatcher(repo.root, cwd, pats or ['.'], opts.get('include'),
opts.get('exclude'), head)
Matt Mackall
kill makewalk function
r3528 def walk(repo, pats=[], opts={}, node=None, head='', badmatch=None):
Vadim Gelfer
move walk and matchpats from commands to cmdutil.
r2882 files, matchfn, anypats = matchpats(repo, pats, opts, head)
Matt Mackall
convert dict(zip(x,x)) to dict.fromkeys(x)
r3531 exact = dict.fromkeys(files)
Matt Mackall
kill makewalk function
r3528 for src, fn in repo.walk(node=node, files=files, match=matchfn,
badmatch=badmatch):
yield src, fn, util.pathto(repo.getcwd(), fn), fn in exact
Vadim Gelfer
move commands.addremove_lock to cmdutil.addremove
r2883
Vadim Gelfer
addremove: add -s/--similarity option...
r2958 def findrenames(repo, added=None, removed=None, threshold=0.5):
if added is None or removed is None:
added, removed = repo.status()[1:3]
changes = repo.changelog.read(repo.dirstate.parents()[0])
mf = repo.manifest.read(changes[0])
for a in added:
aa = repo.wread(a)
bestscore, bestname = None, None
for r in removed:
rr = repo.file(r).read(mf[r])
delta = mdiff.textdiff(aa, rr)
if len(delta) < len(aa):
myscore = 1.0 - (float(len(delta)) / len(aa))
if bestscore is None or myscore > bestscore:
bestscore, bestname = myscore, r
if bestname and bestscore >= threshold:
yield bestname, a, bestscore
def addremove(repo, pats=[], opts={}, wlock=None, dry_run=None,
similarity=None):
Vadim Gelfer
move commands.addremove_lock to cmdutil.addremove
r2883 if dry_run is None:
dry_run = opts.get('dry_run')
Vadim Gelfer
addremove: add -s/--similarity option...
r2958 if similarity is None:
similarity = float(opts.get('similarity') or 0)
Vadim Gelfer
move commands.addremove_lock to cmdutil.addremove
r2883 add, remove = [], []
Vadim Gelfer
addremove: add -s/--similarity option...
r2958 mapping = {}
Vadim Gelfer
move commands.addremove_lock to cmdutil.addremove
r2883 for src, abs, rel, exact in walk(repo, pats, opts):
if src == 'f' and repo.dirstate.state(abs) == '?':
add.append(abs)
Vadim Gelfer
addremove: add -s/--similarity option...
r2958 mapping[abs] = rel, exact
Vadim Gelfer
move commands.addremove_lock to cmdutil.addremove
r2883 if repo.ui.verbose or not exact:
repo.ui.status(_('adding %s\n') % ((pats and rel) or abs))
if repo.dirstate.state(abs) != 'r' and not os.path.exists(rel):
remove.append(abs)
Vadim Gelfer
addremove: add -s/--similarity option...
r2958 mapping[abs] = rel, exact
Vadim Gelfer
move commands.addremove_lock to cmdutil.addremove
r2883 if repo.ui.verbose or not exact:
repo.ui.status(_('removing %s\n') % ((pats and rel) or abs))
if not dry_run:
repo.add(add, wlock=wlock)
repo.remove(remove, wlock=wlock)
Vadim Gelfer
addremove: add -s/--similarity option...
r2958 if similarity > 0:
for old, new, score in findrenames(repo, add, remove, similarity):
oldrel, oldexact = mapping[old]
newrel, newexact = mapping[new]
if repo.ui.verbose or not oldexact or not newexact:
repo.ui.status(_('recording removal of %s as rename to %s '
'(%d%% similar)\n') %
(oldrel, newrel, score * 100))
if not dry_run:
repo.copy(old, new, wlock=wlock)