##// END OF EJS Templates
convert-repo: fix up octopus merge conversion
convert-repo: fix up octopus merge conversion

File last commit:

r1381:c29c3674 default
r1389:9b3ef6f3 default
Show More
commands.py
2222 lines | 74.5 KiB | text/x-python | PythonLexer
mpm@selenic.com
import and startup cleanups...
r249 # commands.py - command processing for mercurial
#
# Copyright 2005 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.
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 from demandload import demandload
mpm@selenic.com
commands: use node functions directly
r1092 from node import *
mpm@selenic.com
Add --debugger global option...
r1225 demandload(globals(), "os re sys signal shutil imp urllib pdb")
mpm@selenic.com
commands: use revlog directly for debug commands...
r1093 demandload(globals(), "fancyopts ui hg util lock revlog")
Bryan O'Sullivan
Add locate command....
r627 demandload(globals(), "fnmatch hgweb mdiff random signal time traceback")
mpm@selenic.com
Add preliminary support for the bundle and unbundle commands
r1218 demandload(globals(), "errno socket version struct atexit sets bz2")
mpm@selenic.com
Beginning of new command parsing interface...
r209
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 class UnknownCommand(Exception):
"""Exception raised if command is not in the command table."""
mpm@selenic.com
Beginning of new command parsing interface...
r209
mpm@selenic.com
big heap of command clean-up work...
r245 def filterfiles(filters, files):
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 l = [x for x in files if x in filters]
mpm@selenic.com
commands: migrate status and branch...
r213
mpm@selenic.com
big heap of command clean-up work...
r245 for t in filters:
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 if t and t[-1] != "/":
t += "/"
l += [x for x in files if x.startswith(t)]
mpm@selenic.com
commands: migrate status and branch...
r213 return l
mpm@selenic.com
Beginning of new command parsing interface...
r209 def relpath(repo, args):
Bryan O'Sullivan
Use repo.getcwd() in a few obvious places....
r628 cwd = repo.getcwd()
if cwd:
Bryan O'Sullivan
Fix walk path handling on Windows
r886 return [util.normpath(os.path.join(cwd, x)) for x in args]
mpm@selenic.com
Beginning of new command parsing interface...
r209 return args
mpm@selenic.com
big heap of command clean-up work...
r245
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 def matchpats(repo, cwd, pats=[], opts={}, head=''):
mpm@selenic.com
Change canonpath to not know about repo objects...
r1081 return util.matcher(repo.root, cwd, pats or ['.'], opts.get('include'),
mpm@selenic.com
Refactor matchpats and walk...
r742 opts.get('exclude'), head)
Bryan O'Sullivan
Get add and locate to use new repo and dirstate walk code....
r724
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 def makewalk(repo, pats, opts, head=''):
Bryan O'Sullivan
Get add and locate to use new repo and dirstate walk code....
r724 cwd = repo.getcwd()
Bryan O'Sullivan
Rewrite log command. New version is faster and more featureful....
r1031 files, matchfn, anypats = matchpats(repo, cwd, pats, opts, head)
Bryan O'Sullivan
Modify commands.walk to yield a 4-tuple....
r942 exact = dict(zip(files, files))
Bryan O'Sullivan
Fix performance of hg diff....
r837 def walk():
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 for src, fn in repo.walk(files=files, match=matchfn):
Bryan O'Sullivan
Modify commands.walk to yield a 4-tuple....
r942 yield src, fn, util.pathto(cwd, fn), fn in exact
Bryan O'Sullivan
Fix performance of hg diff....
r837 return files, matchfn, walk()
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 def walk(repo, pats, opts, head=''):
Bryan O'Sullivan
Fix performance of hg diff....
r837 files, matchfn, results = makewalk(repo, pats, opts, head)
Thomas Arendsen Hein
Cleanups to commands.py
r1065 for r in results:
yield r
Bryan O'Sullivan
Get add and locate to use new repo and dirstate walk code....
r724
Bryan O'Sullivan
Add grep command....
r1057 def walkchangerevs(ui, repo, cwd, pats, opts):
bos@serpentine.internal.keyresearch.com
grep: extend functionality, add man page entry, add unit test....
r1146 '''Iterate over files and the revs they changed in.
Callers most commonly need to iterate backwards over the history
it is interested in. Doing so has awful (quadratic-looking)
performance, so we use iterators in a "windowed" way.
We walk a window of revisions in the desired order. Within the
window, we first walk forwards to gather data, then in the desired
order (usually backwards) to display it.
This function returns an (iterator, getchange) pair. The
getchange function returns the changelog entry for a numeric
revision. The iterator yields 3-tuples. They will be of one of
the following forms:
"window", incrementing, lastrev: stepping through a window,
positive if walking forwards through revs, last rev in the
sequence iterated over - use to reset state for the current window
"add", rev, fns: out-of-order traversal of the given file names
fns, which changed during revision rev - use to gather data for
possible display
"iter", rev, None: in-order traversal of the revs earlier iterated
over with "add" - use to display data'''
mpm@selenic.com
Fix up some bugs for log and grep with empty repo
r1337
if repo.changelog.count() == 0:
return [], False
Bryan O'Sullivan
Add grep command....
r1057 cwd = repo.getcwd()
if not pats and cwd:
opts['include'] = [os.path.join(cwd, i) for i in opts['include']]
opts['exclude'] = [os.path.join(cwd, x) for x in opts['exclude']]
files, matchfn, anypats = matchpats(repo, (pats and cwd) or '',
pats, opts)
revs = map(int, revrange(ui, repo, opts['rev'] or ['tip:0']))
wanted = {}
slowpath = anypats
window = 300
fncache = {}
bos@serpentine.internal.keyresearch.com
grep: extend functionality, add man page entry, add unit test....
r1146
chcache = {}
def getchange(rev):
ch = chcache.get(rev)
if ch is None:
chcache[rev] = ch = repo.changelog.read(repo.lookup(str(rev)))
return ch
Bryan O'Sullivan
Add grep command....
r1057 if not slowpath and not files:
# No files, no patterns. Display all revs.
wanted = dict(zip(revs, revs))
if not slowpath:
# Only files, no patterns. Check the history of each file.
def filerevgen(filelog):
for i in xrange(filelog.count() - 1, -1, -window):
revs = []
for j in xrange(max(0, i - window), i + 1):
revs.append(filelog.linkrev(filelog.node(j)))
revs.reverse()
for rev in revs:
yield rev
minrev, maxrev = min(revs), max(revs)
for file in files:
filelog = repo.file(file)
# A zero count may be a directory or deleted file, so
# try to find matching entries on the slow path.
if filelog.count() == 0:
slowpath = True
break
for rev in filerevgen(filelog):
if rev <= maxrev:
Thomas Arendsen Hein
Cleanups to commands.py
r1065 if rev < minrev:
break
Bryan O'Sullivan
Add grep command....
r1057 fncache.setdefault(rev, [])
fncache[rev].append(file)
wanted[rev] = 1
if slowpath:
# The slow path checks files modified in every changeset.
def changerevgen():
for i in xrange(repo.changelog.count() - 1, -1, -window):
for j in xrange(max(0, i - window), i + 1):
bos@serpentine.internal.keyresearch.com
grep: extend functionality, add man page entry, add unit test....
r1146 yield j, getchange(j)[3]
Bryan O'Sullivan
Add grep command....
r1057
for rev, changefiles in changerevgen():
matches = filter(matchfn, changefiles)
if matches:
fncache[rev] = matches
wanted[rev] = 1
bos@serpentine.internal.keyresearch.com
grep: extend functionality, add man page entry, add unit test....
r1146 def iterate():
for i in xrange(0, len(revs), window):
yield 'window', revs[0] < revs[-1], revs[-1]
nrevs = [rev for rev in revs[i:min(i+window, len(revs))]
if rev in wanted]
srevs = list(nrevs)
srevs.sort()
for rev in srevs:
fns = fncache.get(rev) or filter(matchfn, getchange(rev)[3])
yield 'add', rev, fns
for rev in nrevs:
yield 'iter', rev, None
return iterate(), getchange
Bryan O'Sullivan
Add grep command....
r1057
mpm@selenic.com
[PATCH] New export patch...
r580 revrangesep = ':'
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 def revrange(ui, repo, revs, revlog=None):
Thomas Arendsen Hein
Shortened commands.revrange() a little bit, added docstring.
r1066 """Yield revision as strings from a list of revision specifications."""
mpm@selenic.com
[PATCH] New export patch...
r580 if revlog is None:
revlog = repo.changelog
revcount = revlog.count()
def fix(val, defval):
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 if not val:
return defval
mpm@selenic.com
[PATCH] New export patch...
r580 try:
num = int(val)
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 if str(num) != val:
raise ValueError
Bryan O'Sullivan
Clamp negative rev numbers at zero....
r1257 if num < 0: num += revcount
if num < 0: num = 0
elif num >= revcount:
mpm@selenic.com
[PATCH] New export patch...
r580 raise ValueError
except ValueError:
try:
num = repo.changelog.rev(repo.lookup(val))
except KeyError:
try:
num = revlog.rev(revlog.lookup(val))
except KeyError:
Bryan O'Sullivan
Teach walk code about absolute paths....
r870 raise util.Abort('invalid revision identifier %s', val)
mpm@selenic.com
[PATCH] New export patch...
r580 return num
bos@serpentine.internal.keyresearch.com
grep: extend functionality, add man page entry, add unit test....
r1146 seen = {}
mpm@selenic.com
[PATCH] New export patch...
r580 for spec in revs:
if spec.find(revrangesep) >= 0:
start, end = spec.split(revrangesep, 1)
start = fix(start, 0)
end = fix(end, revcount - 1)
Thomas Arendsen Hein
Shortened commands.revrange() a little bit, added docstring.
r1066 step = start > end and -1 or 1
for rev in xrange(start, end+step, step):
bos@serpentine.internal.keyresearch.com
grep: extend functionality, add man page entry, add unit test....
r1146 if rev in seen: continue
seen[rev] = 1
mpm@selenic.com
[PATCH] New export patch...
r580 yield str(rev)
else:
bos@serpentine.internal.keyresearch.com
grep: extend functionality, add man page entry, add unit test....
r1146 rev = fix(spec, None)
if rev in seen: continue
seen[rev] = 1
yield str(rev)
mpm@selenic.com
[PATCH] New export patch...
r580
Bryan O'Sullivan
Split make_file back out into make_filename and make_file....
r739 def make_filename(repo, r, pat, node=None,
Bryan O'Sullivan
Switch cat command to use walk code....
r1254 total=None, seqno=None, revwidth=None, pathname=None):
thananck@yahoo.com
Provides output option to cat command...
r632 node_expander = {
mpm@selenic.com
commands: use node functions directly
r1092 'H': lambda: hex(node),
thananck@yahoo.com
Provides output option to cat command...
r632 'R': lambda: str(r.rev(node)),
mpm@selenic.com
commands: use node functions directly
r1092 'h': lambda: short(node),
thananck@yahoo.com
Provides output option to cat command...
r632 }
expander = {
'%': lambda: '%',
'b': lambda: os.path.basename(repo.root),
}
Bryan O'Sullivan
Get commands to raise Abort instead of ui.warn(...),sys.exit(1).
r727 try:
if node:
expander.update(node_expander)
if node and revwidth is not None:
expander['r'] = lambda: str(r.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)))
Bryan O'Sullivan
Switch cat command to use walk code....
r1254 if pathname is not None:
expander['s'] = lambda: os.path.basename(pathname)
expander['d'] = lambda: os.path.dirname(pathname) or '.'
expander['p'] = lambda: pathname
thananck@yahoo.com
Provides output option to cat command...
r632
Bryan O'Sullivan
Get commands to raise Abort instead of ui.warn(...),sys.exit(1).
r727 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)
thananck@yahoo.com
Provides output option to cat command...
r632 i += 1
Bryan O'Sullivan
Split make_file back out into make_filename and make_file....
r739 return ''.join(newname)
Bryan O'Sullivan
Get commands to raise Abort instead of ui.warn(...),sys.exit(1).
r727 except KeyError, inst:
Bryan O'Sullivan
Teach walk code about absolute paths....
r870 raise util.Abort("invalid format spec '%%%s' in output file name",
Bryan O'Sullivan
Get commands to raise Abort instead of ui.warn(...),sys.exit(1).
r727 inst.args[0])
thananck@yahoo.com
Provides output option to cat command...
r632
Bryan O'Sullivan
Split make_file back out into make_filename and make_file....
r739 def make_file(repo, r, pat, node=None,
Bryan O'Sullivan
Switch cat command to use walk code....
r1254 total=None, seqno=None, revwidth=None, mode='wb', pathname=None):
Bryan O'Sullivan
Split make_file back out into make_filename and make_file....
r739 if not pat or pat == '-':
Thomas Arendsen Hein
Cleanups to commands.py
r1065 return 'w' in mode and sys.stdout or sys.stdin
Bryan O'Sullivan
Split make_file back out into make_filename and make_file....
r739 if hasattr(pat, 'write') and 'w' in mode:
return pat
if hasattr(pat, 'read') and 'r' in mode:
return pat
Bryan O'Sullivan
Switch cat command to use walk code....
r1254 return open(make_filename(repo, r, pat, node, total, seqno, revwidth,
pathname),
Bryan O'Sullivan
Split make_file back out into make_filename and make_file....
r739 mode)
mpm@selenic.com
Clean up argument passing for dodiff
r1014 def dodiff(fp, ui, repo, node1, node2, files=None, match=util.always,
mpm@selenic.com
Add automatic binary file detection to diff and export...
r1015 changes=None, text=False):
mason@suse.com
Add optional parameter for changed/added/del/unknown files to commands.dodiff...
r904 if not changes:
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 (c, a, d, u) = repo.changes(node1, node2, files, match=match)
mason@suse.com
Add optional parameter for changed/added/del/unknown files to commands.dodiff...
r904 else:
(c, a, d, u) = changes
mpm@selenic.com
Propagate file list through dodiff...
r537 if files:
c, a, d = map(lambda x: filterfiles(files, x), (c, a, d))
if not c and not a and not d:
return
mpm@selenic.com
big heap of command clean-up work...
r245 if node2:
change = repo.changelog.read(node2)
mmap2 = repo.manifest.read(change[0])
Bryan O'Sullivan
Clean up date and timezone handling....
r1321 date2 = util.datestr(change[2])
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 def read(f):
return repo.file(f).read(mmap2[f])
mpm@selenic.com
big heap of command clean-up work...
r245 else:
Bryan O'Sullivan
Fix up representation of dates in hgweb....
r1320 date2 = util.datestr()
mpm@selenic.com
big heap of command clean-up work...
r245 if not node1:
node1 = repo.dirstate.parents()[0]
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 def read(f):
return repo.wfile(f).read()
mpm@selenic.com
big heap of command clean-up work...
r245
Thomas Arendsen Hein
Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli....
r396 if ui.quiet:
r = None
else:
mpm@selenic.com
commands: use node functions directly
r1092 hexfunc = ui.verbose and hex or short
Thomas Arendsen Hein
Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli....
r396 r = [hexfunc(node) for node in [node1, node2] if node]
mpm@selenic.com
big heap of command clean-up work...
r245 change = repo.changelog.read(node1)
mmap = repo.manifest.read(change[0])
Bryan O'Sullivan
Clean up date and timezone handling....
r1321 date1 = util.datestr(change[2])
mpm@selenic.com
big heap of command clean-up work...
r245
for f in c:
mpm@selenic.com
various merge improvements...
r275 to = None
if f in mmap:
to = repo.file(f).read(mmap[f])
mpm@selenic.com
big heap of command clean-up work...
r245 tn = read(f)
mpm@selenic.com
Add automatic binary file detection to diff and export...
r1015 fp.write(mdiff.unidiff(to, date1, tn, date2, f, r, text=text))
mpm@selenic.com
big heap of command clean-up work...
r245 for f in a:
mpm@selenic.com
Attempt to make diff deal with null sources properly...
r264 to = None
mpm@selenic.com
big heap of command clean-up work...
r245 tn = read(f)
mpm@selenic.com
Add automatic binary file detection to diff and export...
r1015 fp.write(mdiff.unidiff(to, date1, tn, date2, f, r, text=text))
mpm@selenic.com
big heap of command clean-up work...
r245 for f in d:
to = repo.file(f).read(mmap[f])
mpm@selenic.com
Attempt to make diff deal with null sources properly...
r264 tn = None
mpm@selenic.com
Add automatic binary file detection to diff and export...
r1015 fp.write(mdiff.unidiff(to, date1, tn, date2, f, r, text=text))
Thomas Arendsen Hein
Use common output function show_changeset() for hg heads|history|log|tip....
r329
bos@serpentine.internal.keyresearch.com
Merge with TAH.
r1147 def trimuser(ui, name, rev, revcache):
bos@serpentine.internal.keyresearch.com
grep: extend functionality, add man page entry, add unit test....
r1146 """trim the name of the user who committed a change"""
bos@serpentine.internal.keyresearch.com
Merge with TAH.
r1147 user = revcache.get(rev)
if user is None:
user = revcache[rev] = ui.shortuser(name)
return user
bos@serpentine.internal.keyresearch.com
grep: extend functionality, add man page entry, add unit test....
r1146
Bryan O'Sullivan
Rewrite log command. New version is faster and more featureful....
r1031 def show_changeset(ui, repo, rev=0, changenode=None, brinfo=None):
Thomas Arendsen Hein
Use common output function show_changeset() for hg heads|history|log|tip....
r329 """show a single changeset or file revision"""
Bryan O'Sullivan
Rewrite log command. New version is faster and more featureful....
r1031 log = repo.changelog
if changenode is None:
changenode = log.node(rev)
elif not rev:
rev = log.rev(changenode)
Thomas Arendsen Hein
Use common output function show_changeset() for hg heads|history|log|tip....
r329
if ui.quiet:
mpm@selenic.com
commands: use node functions directly
r1092 ui.write("%d:%s\n" % (rev, short(changenode)))
Thomas Arendsen Hein
Use common output function show_changeset() for hg heads|history|log|tip....
r329 return
Bryan O'Sullivan
Rewrite log command. New version is faster and more featureful....
r1031 changes = log.read(changenode)
Bryan O'Sullivan
Clean up date and timezone handling....
r1321 date = util.datestr(changes[2])
Samuel Tardieu
[PATCH] Print timezone offset when outputting dates...
r967
mpm@selenic.com
commands: use node functions directly
r1092 parents = [(log.rev(p), ui.verbose and hex(p) or short(p))
Bryan O'Sullivan
Rewrite log command. New version is faster and more featureful....
r1031 for p in log.parents(changenode)
mpm@selenic.com
commands: use node functions directly
r1092 if ui.debugflag or p != nullid]
Thomas Arendsen Hein
Use common output function show_changeset() for hg heads|history|log|tip....
r329 if not ui.debugflag and len(parents) == 1 and parents[0][0] == rev-1:
parents = []
mpm@selenic.com
Shorten hashes displayed in log
r778 if ui.verbose:
mpm@selenic.com
commands: use node functions directly
r1092 ui.write("changeset: %d:%s\n" % (rev, hex(changenode)))
mpm@selenic.com
Shorten hashes displayed in log
r778 else:
mpm@selenic.com
commands: use node functions directly
r1092 ui.write("changeset: %d:%s\n" % (rev, short(changenode)))
mpm@selenic.com
Shorten hashes displayed in log
r778
Matt Mackall
Hide file hashes in log...
r687 for tag in repo.nodetags(changenode):
ui.status("tag: %s\n" % tag)
for parent in parents:
ui.write("parent: %d:%s\n" % parent)
mpm@selenic.com
Shorten hashes displayed in log
r778
mason@suse.com
Add searching for named branches...
r898 if brinfo and changenode in brinfo:
br = brinfo[changenode]
ui.write("branch: %s\n" % " ".join(br))
mpm@selenic.com
Shorten hashes displayed in log
r778 ui.debug("manifest: %d:%s\n" % (repo.manifest.rev(changes[0]),
mpm@selenic.com
commands: use node functions directly
r1092 hex(changes[0])))
Thomas Arendsen Hein
Use common output function show_changeset() for hg heads|history|log|tip....
r329 ui.status("user: %s\n" % changes[1])
Samuel Tardieu
[PATCH] Print timezone offset when outputting dates...
r967 ui.status("date: %s\n" % date)
mpm@selenic.com
Shorten hashes displayed in log
r778
Thomas Arendsen Hein
Make show_changeset show added/deleted files only in debug mode....
r493 if ui.debugflag:
Bryan O'Sullivan
Rewrite log command. New version is faster and more featureful....
r1031 files = repo.changes(log.parents(changenode)[0], changenode)
Thomas Arendsen Hein
Make show_changeset show added and deleted files in verbose mode....
r490 for key, value in zip(["files:", "files+:", "files-:"], files):
if value:
ui.note("%-12s %s\n" % (key, " ".join(value)))
Thomas Arendsen Hein
Make show_changeset show added/deleted files only in debug mode....
r493 else:
ui.note("files: %s\n" % " ".join(changes[3]))
mpm@selenic.com
Shorten hashes displayed in log
r778
Thomas Arendsen Hein
Cleaned up show_changeset()...
r347 description = changes[4].strip()
Thomas Arendsen Hein
Use common output function show_changeset() for hg heads|history|log|tip....
r329 if description:
mpm@selenic.com
Merge with TAH...
r330 if ui.verbose:
ui.status("description:\n")
Thomas Arendsen Hein
Cleaned up show_changeset()...
r347 ui.status(description)
Thomas Arendsen Hein
Add an empty line after description in verbose mode of show_changeset....
r546 ui.status("\n\n")
mpm@selenic.com
Merge with TAH...
r330 else:
Thomas Arendsen Hein
Cleaned up show_changeset()...
r347 ui.status("summary: %s\n" % description.splitlines()[0])
Thomas Arendsen Hein
Use common output function show_changeset() for hg heads|history|log|tip....
r329 ui.status("\n")
mpm@selenic.com
Fix up version module name and command conflict...
r470 def show_version(ui):
Thomas Arendsen Hein
Support for 'hg --version'. setup.py stores version from hg repository....
r423 """output version and copyright information"""
Thomas Arendsen Hein
Further help improvements:...
r849 ui.write("Mercurial Distributed SCM (version %s)\n"
% version.get_version())
Thomas Arendsen Hein
Support for 'hg --version'. setup.py stores version from hg repository....
r423 ui.status(
"\nCopyright (C) 2005 Matt Mackall <mpm@selenic.com>\n"
"This is free software; see the source for copying conditions. "
"There is NO\nwarranty; "
"not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
)
Thomas Arendsen Hein
Allow --help and --version being used together.
r1049 def help_(ui, cmd=None, with_version=False):
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 """show help for a given command or all commands"""
Thomas Arendsen Hein
Adjust display and alignment of command options to match global options.
r1052 option_lists = []
kreijack@inwind.REMOVEME.it
When hg is invoked without parameters, the short list help is displayed....
r846 if cmd and cmd != 'shortlist':
Thomas Arendsen Hein
Allow --help and --version being used together.
r1049 if with_version:
show_version(ui)
ui.write('\n')
Thomas Arendsen Hein
Further help improvements:...
r849 key, i = find(cmd)
# synopsis
Thomas Arendsen Hein
Always show short help when an unknown command is given.
r848 ui.write("%s\n\n" % i[2])
mpm@selenic.com
hg help improvements...
r293
Thomas Arendsen Hein
Further help improvements:...
r849 # description
doc = i[0].__doc__
if ui.quiet:
doc = doc.splitlines(0)[0]
ui.write("%s\n" % doc.rstrip())
if not ui.quiet:
Thomas Arendsen Hein
Adjust display and alignment of command options to match global options.
r1052 # aliases
Thomas Arendsen Hein
Further help improvements:...
r849 aliases = ', '.join(key.split('|')[1:])
if aliases:
ui.write("\naliases: %s\n" % aliases)
Thomas Arendsen Hein
Adjust display and alignment of command options to match global options.
r1052 # options
if i[1]:
option_lists.append(("options", i[1]))
mpm@selenic.com
hg help improvements...
r293
mpm@selenic.com
hg help: use docstrings only...
r255 else:
Thomas Arendsen Hein
Further help improvements:...
r849 # program name
Thomas Arendsen Hein
Allow --help and --version being used together.
r1049 if ui.verbose or with_version:
mpm@selenic.com
Fix up version module name and command conflict...
r470 show_version(ui)
Thomas Arendsen Hein
Further help improvements:...
r849 else:
ui.status("Mercurial Distributed SCM\n")
ui.status('\n')
kreijack@inwind.REMOVEME.it
'hg help -v' shows global options
r843
Thomas Arendsen Hein
Further help improvements:...
r849 # list of commands
kreijack@inwind.REMOVEME.it
When hg is invoked without parameters, the short list help is displayed....
r846 if cmd == "shortlist":
Thomas Arendsen Hein
Further help improvements:...
r849 ui.status('basic commands (use "hg help" '
'for the full list or option "-v" for details):\n\n')
elif ui.verbose:
ui.status('list of commands:\n\n')
else:
ui.status('list of commands (use "hg help -v" '
'to show aliases and global options):\n\n')
mpm@selenic.com
Beginning of new command parsing interface...
r209
mpm@selenic.com
hg help: use docstrings only...
r255 h = {}
kreijack@inwind.REMOVEME.it
'hg help -v' mentions the alias of the commands
r844 cmds = {}
Thomas Arendsen Hein
Cleaned up command alias handling in help....
r479 for c, e in table.items():
f = c.split("|")[0]
kreijack@inwind.REMOVEME.it
When hg is invoked without parameters, the short list help is displayed....
r846 if cmd == "shortlist" and not f.startswith("^"):
Thomas Arendsen Hein
Cleaned up command alias handling in help....
r479 continue
Thomas Arendsen Hein
Further help improvements:...
r849 f = f.lstrip("^")
mpm@selenic.com
Shorten help...
r593 if not ui.debugflag and f.startswith("debug"):
continue
mpm@selenic.com
hg help: use docstrings only...
r255 d = ""
mpm@selenic.com
Fix up version module name and command conflict...
r470 if e[0].__doc__:
d = e[0].__doc__.splitlines(0)[0].rstrip()
h[f] = d
kreijack@inwind.REMOVEME.it
'hg help -v' mentions the alias of the commands
r844 cmds[f]=c.lstrip("^")
mpm@selenic.com
hg help: use docstrings only...
r255
fns = h.keys()
fns.sort()
m = max(map(len, fns))
for f in fns:
kreijack@inwind.REMOVEME.it
'hg help -v' mentions the alias of the commands
r844 if ui.verbose:
commands = cmds[f].replace("|",", ")
ui.write(" %s:\n %s\n"%(commands,h[f]))
else:
ui.write(' %-*s %s\n' % (m, f, h[f]))
mpm@selenic.com
hg help: use docstrings only...
r255
Thomas Arendsen Hein
Further help improvements:...
r849 # global options
if ui.verbose:
Thomas Arendsen Hein
Adjust display and alignment of command options to match global options.
r1052 option_lists.append(("global options", globalopts))
# list all option lists
opt_output = []
for title, options in option_lists:
opt_output.append(("\n%s:\n" % title, None))
for shortopt, longopt, default, desc in options:
opt_output.append(("%2s%s" % (shortopt and "-%s" % shortopt,
longopt and " --%s" % longopt),
"%s%s" % (desc,
default and " (default: %s)" % default
or "")))
if opt_output:
opts_len = max([len(line[0]) for line in opt_output if line[1]])
for first, second in opt_output:
if second:
ui.write(" %-*s %s\n" % (opts_len, first, second))
else:
ui.write("%s\n" % first)
Thomas Arendsen Hein
Further help improvements:...
r849
mpm@selenic.com
hg help: use docstrings only...
r255 # Commands start here, listed alphabetically
mpm@selenic.com
Beginning of new command parsing interface...
r209
Bryan O'Sullivan
Get add and locate to use new repo and dirstate walk code....
r724 def add(ui, repo, *pats, **opts):
mpm@selenic.com
big heap of command clean-up work...
r245 '''add the specified files on the next commit'''
Bryan O'Sullivan
Get add and locate to use new repo and dirstate walk code....
r724 names = []
Bryan O'Sullivan
Modify commands.walk to yield a 4-tuple....
r942 for src, abs, rel, exact in walk(repo, pats, opts):
if exact:
Bryan O'Sullivan
Get all commands that operate on files to honour --verbose and --quiet....
r1255 if ui.verbose: ui.status('adding %s\n' % rel)
Bryan O'Sullivan
Get add and locate to use new repo and dirstate walk code....
r724 names.append(abs)
elif repo.dirstate.state(abs) == '?':
ui.status('adding %s\n' % rel)
names.append(abs)
repo.add(names)
mpm@selenic.com
commands: migrate status and branch...
r213
Bryan O'Sullivan
Get addremove to use new walk code....
r766 def addremove(ui, repo, *pats, **opts):
mpm@selenic.com
hg help: use docstrings only...
r255 """add all new files, delete all missing files"""
Bryan O'Sullivan
Fix performance regression in addremove command....
r809 add, remove = [], []
Bryan O'Sullivan
Modify commands.walk to yield a 4-tuple....
r942 for src, abs, rel, exact in walk(repo, pats, opts):
mason@suse.com
addremove was not correctly finding removed files when given...
r880 if src == 'f' and repo.dirstate.state(abs) == '?':
add.append(abs)
Bryan O'Sullivan
Get all commands that operate on files to honour --verbose and --quiet....
r1255 if ui.verbose or not exact:
Thomas Arendsen Hein
Cleanups to commands.py
r1065 ui.status('adding ', rel, '\n')
mason@suse.com
addremove was not correctly finding removed files when given...
r880 if repo.dirstate.state(abs) != 'r' and not os.path.exists(rel):
Bryan O'Sullivan
Fix performance regression in addremove command....
r809 remove.append(abs)
Bryan O'Sullivan
Get all commands that operate on files to honour --verbose and --quiet....
r1255 if ui.verbose or not exact:
Thomas Arendsen Hein
Cleanups to commands.py
r1065 ui.status('removing ', rel, '\n')
Bryan O'Sullivan
Fix performance regression in addremove command....
r809 repo.add(add)
repo.remove(remove)
mpm@selenic.com
hg checkout: refuse to checkout if there are outstanding changes...
r219
Bryan O'Sullivan
Convert annotate over to walk interface....
r733 def annotate(ui, repo, *pats, **opts):
mpm@selenic.com
hg help: use docstrings only...
r255 """show changeset information per file line"""
mpm@selenic.com
Beginning of new command parsing interface...
r209 def getnode(rev):
mpm@selenic.com
commands: use node functions directly
r1092 return short(repo.changelog.node(rev))
mpm@selenic.com
Beginning of new command parsing interface...
r209
bos@serpentine.internal.keyresearch.com
grep: extend functionality, add man page entry, add unit test....
r1146 ucache = {}
mpm@selenic.com
Beginning of new command parsing interface...
r209 def getname(rev):
bos@serpentine.internal.keyresearch.com
grep: extend functionality, add man page entry, add unit test....
r1146 cl = repo.changelog.read(repo.changelog.node(rev))
bos@serpentine.internal.keyresearch.com
Merge with TAH.
r1147 return trimuser(ui, cl[1], rev, ucache)
mpm@selenic.com
[PATCH] Clean up destination directory if a clone fails....
r500
mpm@selenic.com
Handle empty file list for annotate
r744 if not pats:
Bryan O'Sullivan
Teach walk code about absolute paths....
r870 raise util.Abort('at least one file name or pattern required')
mpm@selenic.com
Handle empty file list for annotate
r744
mpm@selenic.com
Beginning of new command parsing interface...
r209 opmap = [['user', getname], ['number', str], ['changeset', getnode]]
Thomas Arendsen Hein
Some cleanups in commands.annotate()....
r714 if not opts['user'] and not opts['changeset']:
opts['number'] = 1
mpm@selenic.com
Beginning of new command parsing interface...
r209
Thomas Arendsen Hein
Make annotate use option --rev instead od --revision like other commands....
r715 if opts['rev']:
node = repo.changelog.lookup(opts['rev'])
Thomas Arendsen Hein
Some cleanups in commands.annotate()....
r714 else:
node = repo.dirstate.parents()[0]
mpm@selenic.com
Beginning of new command parsing interface...
r209 change = repo.changelog.read(node)
mmap = repo.manifest.read(change[0])
mpm@selenic.com
Teach annotate about binary files
r1016
Bryan O'Sullivan
Modify commands.walk to yield a 4-tuple....
r942 for src, abs, rel, exact in walk(repo, pats, opts):
mpm@selenic.com
Fixes for annotate...
r771 if abs not in mmap:
ui.warn("warning: %s is not in the repository!\n" % rel)
continue
mpm@selenic.com
Teach annotate about binary files
r1016 f = repo.file(abs)
if not opts['text'] and util.binary(f.read(mmap[abs])):
ui.write("%s: binary file\n" % rel)
continue
lines = f.annotate(mmap[abs])
mpm@selenic.com
Beginning of new command parsing interface...
r209 pieces = []
for o, f in opmap:
Thomas Arendsen Hein
Some cleanups in commands.annotate()....
r714 if opts[o]:
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 l = [f(n) for n, dummy in lines]
mpm@selenic.com
Fixes for annotate...
r771 if l:
m = max(map(len, l))
pieces.append(["%*s" % (m, x) for x in l])
mpm@selenic.com
Beginning of new command parsing interface...
r209
mpm@selenic.com
Fixes for annotate...
r771 if pieces:
for p, l in zip(zip(*pieces), lines):
ui.write("%s: %s" % (" ".join(p), l[1]))
mpm@selenic.com
Beginning of new command parsing interface...
r209
mpm@selenic.com
Add preliminary support for the bundle and unbundle commands
r1218 def bundle(ui, repo, fname, dest="default-push", **opts):
"""create a changegroup file"""
f = open(fname, "wb")
dest = ui.expandpath(dest)
other = hg.repository(ui, dest)
o = repo.findoutgoing(other)
cg = repo.changegroup(o)
try:
f.write("HG10")
z = bz2.BZ2Compressor(9)
while 1:
chunk = cg.read(4096)
if not chunk:
break
f.write(z.compress(chunk))
f.write(z.flush())
except:
os.unlink(fname)
Eric Hopper
Fixed an exception that was caught and improperly forgotten.
r1366 raise
mpm@selenic.com
Add preliminary support for the bundle and unbundle commands
r1218
Bryan O'Sullivan
Switch cat command to use walk code....
r1254 def cat(ui, repo, file1, *pats, **opts):
"""output the latest or given revisions of files"""
mf = {}
if opts['rev']:
change = repo.changelog.read(repo.lookup(opts['rev']))
mf = repo.manifest.read(change[0])
for src, abs, rel, exact in walk(repo, (file1,) + pats, opts):
r = repo.file(abs)
if opts['rev']:
Mikael Berthe
Fix hg cat when the file cannot be found in the specified revision
r1242 try:
Bryan O'Sullivan
Switch cat command to use walk code....
r1254 n = mf[abs]
except (hg.RepoError, KeyError):
try:
n = r.lookup(rev)
except KeyError, inst:
raise util.Abort('cannot find file %s in rev %s', rel, rev)
else:
n = r.tip()
fp = make_file(repo, r, opts['output'], node=n, pathname=abs)
fp.write(r.read(n))
mpm@selenic.com
migrate remaining commands...
r248
Thomas Arendsen Hein
Use python function instead of external 'cp' command when cloning repos....
r698 def clone(ui, source, dest=None, **opts):
mpm@selenic.com
[PATCH] add clone command...
r485 """make a copy of an existing repository"""
if dest is None:
mpm@selenic.com
Fix clone bug wth trailing slash...
r528 dest = os.path.basename(os.path.normpath(source))
mpm@selenic.com
clone: abort on pre-existing destination directory...
r532
if os.path.exists(dest):
mpm@selenic.com
Fix abort message for clone
r1233 raise util.Abort("destination '%s' already exists", dest)
mpm@selenic.com
[PATCH] Force "hg clone" to always create a new directory...
r523
Bryan O'Sullivan
Fix clone when target directory is relative.
r891 dest = os.path.realpath(dest)
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 class Dircleanup:
def __init__(self, dir_):
Matt Mackall
Cleanups for repo.pull...
r625 self.rmtree = shutil.rmtree
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 self.dir_ = dir_
os.mkdir(dir_)
mpm@selenic.com
Deal with failed clone/transaction interaction...
r535 def close(self):
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 self.dir_ = None
mpm@selenic.com
Deal with failed clone/transaction interaction...
r535 def __del__(self):
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 if self.dir_:
self.rmtree(self.dir_, True)
mpm@selenic.com
[PATCH] add clone command...
r485
mpm@selenic.com
Add -e and --remotecmd for clone and pull too
r963 if opts['ssh']:
ui.setconfig("ui", "ssh", opts['ssh'])
if opts['remotecmd']:
ui.setconfig("ui", "remotecmd", opts['remotecmd'])
TK Soh
clone: directory names take precedence over symbolic names...
r1221 if not os.path.exists(source):
source = ui.expandpath(source)
mpm@selenic.com
Fix default clone destination...
r1314
d = Dircleanup(dest)
mpm@selenic.com
hg clone: only use the absolute path for .hg/hgrc...
r562 abspath = source
Matt Mackall
Add a repo method to report repo device...
r634 other = hg.repository(ui, source)
mpm@selenic.com
[PATCH] add clone command...
r485
mpm@selenic.com
clone: fall back to pull if we can't lock the source repo
r1244 copy = False
Lee Cantey
Fix setting of hg default when using --pull on clone of local repository.
r1315 if other.dev() != -1:
Mikael Berthe
hg clone stored path fix...
r675 abspath = os.path.abspath(source)
Lee Cantey
Fix setting of hg default when using --pull on clone of local repository.
r1315 if not opts['pull']:
copy = True
Bryan O'Sullivan
Write hgrc file in text mode, even on Windows.
r1331
mpm@selenic.com
clone: fall back to pull if we can't lock the source repo
r1244 if copy:
try:
# we use a lock here because if we race with commit, we
# can end up with extra data in the cloned revlogs that's
# not pointed to by changesets, thus causing verify to
# fail
l1 = lock.lock(os.path.join(source, ".hg", "lock"))
except OSError:
copy = False
mpm@selenic.com
Fix hg clone race with writer...
r917
mpm@selenic.com
clone: fall back to pull if we can't lock the source repo
r1244 if copy:
# we lock here to avoid premature writing to the target
mpm@selenic.com
Clean up local clone file list...
r1208 os.mkdir(os.path.join(dest, ".hg"))
mpm@selenic.com
Tighten up clone locking...
r1209 l2 = lock.lock(os.path.join(dest, ".hg", "lock"))
Stephen Darnell
Remove the lock file copied during clone (was the source lock file)...
r1114
mpm@selenic.com
Clean up local clone file list...
r1208 files = "data 00manifest.d 00manifest.i 00changelog.d 00changelog.i"
for f in files.split():
src = os.path.join(source, ".hg", f)
dst = os.path.join(dest, ".hg", f)
Stephen Darnell
Add support for cloning with hardlinks on windows....
r1241 util.copyfiles(src, dst)
mpm@selenic.com
Deal with failed clone/transaction interaction...
r535
repo = hg.repository(ui, dest)
mpm@selenic.com
[PATCH] add clone command...
r485
mpm@selenic.com
Deal with failed clone/transaction interaction...
r535 else:
repo = hg.repository(ui, dest, create=1)
Matt Mackall
Cleanups for repo.pull...
r625 repo.pull(other)
mpm@selenic.com
Fix troubles with clone and exception handling...
r503
Bryan O'Sullivan
Write hgrc file in text mode, even on Windows.
r1331 f = repo.opener("hgrc", "w", text=True)
mpm@selenic.com
Redo local clone hgrc fix...
r1206 f.write("[paths]\n")
f.write("default = %s\n" % abspath)
mpm@selenic.com
Whitespace cleanups...
r515
mpm@selenic.com
Deal with failed clone/transaction interaction...
r535 if not opts['noupdate']:
update(ui, repo)
d.close()
mpm@selenic.com
Whitespace cleanups...
r515
Bryan O'Sullivan
Adapt commit to use file matching code....
r813 def commit(ui, repo, *pats, **opts):
mpm@selenic.com
big heap of command clean-up work...
r245 """commit the specified files or all outstanding changes"""
Thomas Arendsen Hein
Added deprecation warnings if -t or --text is used for commits.
r763 if opts['text']:
ui.warn("Warning: -t and --text is deprecated,"
" please use -m or --message instead.\n")
Thomas Arendsen Hein
Changed more occurances of 'text' to 'message'.
r762 message = opts['message'] or opts['text']
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 logfile = opts['logfile']
Bryan O'Sullivan
Fix behaviour of commit....
r1319
if message and logfile:
raise util.Abort('options --message and --logfile are mutually '
'exclusive')
Thomas Arendsen Hein
Changed more occurances of 'text' to 'message'.
r762 if not message and logfile:
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 try:
mark.williamson@cl.cam.ac.uk
Add '-' support to the commit logfile option to read message from stdin.
r899 if logfile == '-':
message = sys.stdin.read()
else:
message = open(logfile).read()
Bryan O'Sullivan
Fix behaviour of commit....
r1319 except IOError, inst:
raise util.Abort("can't read commit message '%s': %s" %
(logfile, inst.strerror))
mpm@selenic.com
hg commit: add -t and -l options...
r289
mpm@selenic.com
hg commit: add -A flag...
r354 if opts['addremove']:
Bryan O'Sullivan
Adapt commit to use file matching code....
r813 addremove(ui, repo, *pats, **opts)
cwd = repo.getcwd()
if not pats and cwd:
opts['include'] = [os.path.join(cwd, i) for i in opts['include']]
opts['exclude'] = [os.path.join(cwd, x) for x in opts['exclude']]
Bryan O'Sullivan
Rewrite log command. New version is faster and more featureful....
r1031 fns, match, anypats = matchpats(repo, (pats and repo.getcwd()) or '',
pats, opts)
Bryan O'Sullivan
Adapt commit to use file matching code....
r813 if pats:
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 c, a, d, u = repo.changes(files=fns, match=match)
Bryan O'Sullivan
Adapt commit to use file matching code....
r813 files = c + a + [fn for fn in d if repo.dirstate.state(fn) == 'r']
else:
files = []
Bryan O'Sullivan
Commit date validation: more stringent checks, more useful error messages.
r1202 try:
repo.commit(files, message, opts['user'], opts['date'], match)
except ValueError, inst:
raise util.Abort(str(inst))
mpm@selenic.com
big heap of command clean-up work...
r245
Bryan O'Sullivan
Add rename/mv command....
r1253 def docopy(ui, repo, pats, opts):
Bryan O'Sullivan
Fix up copy command to behave more like regular "cp"....
r1249 if not pats:
raise util.Abort('no source or destination specified')
elif len(pats) == 1:
raise util.Abort('no destination specified')
pats = list(pats)
dest = pats.pop()
sources = []
def okaytocopy(abs, rel, exact):
reasons = {'?': 'is not managed',
'a': 'has been marked for add'}
reason = reasons.get(repo.dirstate.state(abs))
if reason:
if exact: ui.warn('%s: not copying - file %s\n' % (rel, reason))
else:
return True
for src, abs, rel, exact in walk(repo, pats, opts):
if okaytocopy(abs, rel, exact):
sources.append((abs, rel, exact))
if not sources:
raise util.Abort('no files to copy')
cwd = repo.getcwd()
absdest = util.canonpath(repo.root, cwd, dest)
reldest = util.pathto(cwd, absdest)
if os.path.exists(reldest):
destisfile = not os.path.isdir(reldest)
else:
destisfile = len(sources) == 1 or repo.dirstate.state(absdest) != '?'
if destisfile:
if opts['parents']:
raise util.Abort('with --parents, destination must be a directory')
elif len(sources) > 1:
raise util.Abort('with multiple sources, destination must be a '
'directory')
Bryan O'Sullivan
Add rename/mv command....
r1253 errs, copied = 0, []
Bryan O'Sullivan
Fix up copy command to behave more like regular "cp"....
r1249 for abs, rel, exact in sources:
if opts['parents']:
mydest = os.path.join(dest, rel)
elif destisfile:
mydest = reldest
else:
mydest = os.path.join(dest, os.path.basename(rel))
myabsdest = util.canonpath(repo.root, cwd, mydest)
myreldest = util.pathto(cwd, myabsdest)
if not opts['force'] and repo.dirstate.state(myabsdest) not in 'a?':
ui.warn('%s: not overwriting - file already managed\n' % myreldest)
continue
mydestdir = os.path.dirname(myreldest) or '.'
if not opts['after']:
try:
if opts['parents']: os.makedirs(mydestdir)
elif not destisfile: os.mkdir(mydestdir)
except OSError, inst:
if inst.errno != errno.EEXIST: raise
if ui.verbose or not exact:
ui.status('copying %s to %s\n' % (rel, myreldest))
if not opts['after']:
try:
shutil.copyfile(rel, myreldest)
Eric Hopper
Fix an hg copy/move bug. Failed if file being copied or moved not in tip.
r1380 shutil.copymode(rel, myreldest)
Bryan O'Sullivan
Add rename/mv command....
r1253 except shutil.Error, inst:
raise util.Abort(str(inst))
Bryan O'Sullivan
Fix up copy command to behave more like regular "cp"....
r1249 except IOError, inst:
if inst.errno == errno.ENOENT:
ui.warn('%s: deleted in working copy\n' % rel)
else:
ui.warn('%s: cannot copy - %s\n' % (rel, inst.strerror))
errs += 1
continue
repo.copy(abs, myabsdest)
Bryan O'Sullivan
Add rename/mv command....
r1253 copied.append((abs, rel, exact))
Bryan O'Sullivan
Fix up copy command to behave more like regular "cp"....
r1249 if errs:
Bryan O'Sullivan
Add rename/mv command....
r1253 ui.warn('(consider using --after)\n')
return errs, copied
def copy(ui, repo, *pats, **opts):
"""mark files as copied for the next commit"""
errs, copied = docopy(ui, repo, pats, opts)
Bryan O'Sullivan
Fix up copy command to behave more like regular "cp"....
r1249 return errs
mpm@selenic.com
Add hg copy...
r363
mpm@selenic.com
Add debugancestor command
r1262 def debugancestor(ui, index, rev1, rev2):
"""find the ancestor revision of two revisions in a given index"""
r = revlog.revlog(file, index, "")
a = r.ancestor(r.lookup(rev1), r.lookup(rev2))
ui.write("%d:%s\n" % (r.rev(a), hex(a)))
mpm@selenic.com
A bunch of parsing/help updates...
r596 def debugcheckstate(ui, repo):
"""validate the correctness of the current dirstate"""
mpm@selenic.com
add dirstate debugging commands...
r460 parent1, parent2 = repo.dirstate.parents()
mpm@selenic.com
Unbreak dirstate debug commands...
r555 repo.dirstate.read()
dc = repo.dirstate.map
mpm@selenic.com
add dirstate debugging commands...
r460 keys = dc.keys()
keys.sort()
m1n = repo.changelog.read(parent1)[0]
m2n = repo.changelog.read(parent2)[0]
m1 = repo.manifest.read(m1n)
m2 = repo.manifest.read(m2n)
errors = 0
for f in dc:
state = repo.dirstate.state(f)
if state in "nr" and f not in m1:
mpm@selenic.com
Remove all remaining print statements...
r582 ui.warn("%s in state %s, but not in manifest1\n" % (f, state))
mpm@selenic.com
add dirstate debugging commands...
r460 errors += 1
if state in "a" and f in m1:
mpm@selenic.com
Remove all remaining print statements...
r582 ui.warn("%s in state %s, but also in manifest1\n" % (f, state))
mpm@selenic.com
add dirstate debugging commands...
r460 errors += 1
if state in "m" and f not in m1 and f not in m2:
mpm@selenic.com
Remove all remaining print statements...
r582 ui.warn("%s in state %s, but not in either manifest\n" %
(f, state))
mpm@selenic.com
add dirstate debugging commands...
r460 errors += 1
for f in m1:
state = repo.dirstate.state(f)
if state not in "nrm":
mpm@selenic.com
Remove all remaining print statements...
r582 ui.warn("%s in manifest1, but listed as state %s" % (f, state))
mpm@selenic.com
add dirstate debugging commands...
r460 errors += 1
if errors:
Bryan O'Sullivan
Teach walk code about absolute paths....
r870 raise util.Abort(".hg/dirstate inconsistent with current parent's manifest")
mpm@selenic.com
add dirstate debugging commands...
r460
Bryan O'Sullivan
Add commands.debugconfig....
r1028 def debugconfig(ui):
Thomas Arendsen Hein
Added missing doc strings for two new debug commmands.
r1053 """show combined config settings from all hgrc files"""
Bryan O'Sullivan
Add commands.debugconfig....
r1028 try:
repo = hg.repository(ui)
Thomas Arendsen Hein
Cleanups to commands.py
r1065 except hg.RepoError:
pass
Bryan O'Sullivan
Add commands.debugconfig....
r1028 for section, name, value in ui.walkconfig():
ui.write('%s.%s=%s\n' % (section, name, value))
mpm@selenic.com
A bunch of parsing/help updates...
r596 def debugstate(ui, repo):
"""show the contents of the current dirstate"""
mpm@selenic.com
Unbreak dirstate debug commands...
r555 repo.dirstate.read()
dc = repo.dirstate.map
mpm@selenic.com
add dirstate debugging commands...
r460 keys = dc.keys()
keys.sort()
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 for file_ in keys:
Thomas Arendsen Hein
Show all dirstate info for 'hg debugstate'.
r791 ui.write("%c %3o %10d %s %s\n"
% (dc[file_][0], dc[file_][1] & 0777, dc[file_][2],
time.strftime("%x %X",
time.localtime(dc[file_][3])), file_))
mpm@selenic.com
Add some rename debugging support
r1116 for f in repo.dirstate.copies:
Thomas Arendsen Hein
Changed printing of copies in hg debugstate to: "copy: source -> dest"
r1126 ui.write("copy: %s -> %s\n" % (repo.dirstate.copies[f], f))
mpm@selenic.com
add dirstate debugging commands...
r460
mpm@selenic.com
Add debugdata for dumping revlog revision data
r1039 def debugdata(ui, file_, rev):
"""dump the contents of an data file revision"""
mpm@selenic.com
commands: use revlog directly for debug commands...
r1093 r = revlog.revlog(file, file_[:-2] + ".i", file_)
Anupam Kapoor
Fix traceback during invalid rev identifier for debugdata
r1313 try:
ui.write(r.revision(r.lookup(rev)))
except KeyError:
raise util.Abort('invalid revision identifier %s', rev)
mpm@selenic.com
Add debugdata for dumping revlog revision data
r1039
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 def debugindex(ui, file_):
mpm@selenic.com
A bunch of parsing/help updates...
r596 """dump the contents of an index file"""
mpm@selenic.com
commands: use revlog directly for debug commands...
r1093 r = revlog.revlog(file, file_, "")
mpm@selenic.com
Remove all remaining print statements...
r582 ui.write(" rev offset length base linkrev" +
mpm@selenic.com
Reformat debugindex output
r989 " nodeid p1 p2\n")
mpm@selenic.com
migrate remaining commands...
r248 for i in range(r.count()):
e = r.index[i]
mpm@selenic.com
Reformat debugindex output
r989 ui.write("% 6d % 9d % 7d % 6d % 7d %s %s %s\n" % (
mpm@selenic.com
Remove all remaining print statements...
r582 i, e[0], e[1], e[2], e[3],
mpm@selenic.com
commands: use node functions directly
r1092 short(e[6]), short(e[4]), short(e[5])))
mpm@selenic.com
migrate remaining commands...
r248
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 def debugindexdot(ui, file_):
mpm@selenic.com
A bunch of parsing/help updates...
r596 """dump an index DAG as a .dot file"""
mpm@selenic.com
commands: use revlog directly for debug commands...
r1093 r = revlog.revlog(file, file_, "")
mpm@selenic.com
Remove all remaining print statements...
r582 ui.write("digraph G {\n")
mpm@selenic.com
migrate remaining commands...
r248 for i in range(r.count()):
e = r.index[i]
mpm@selenic.com
Remove all remaining print statements...
r582 ui.write("\t%d -> %d\n" % (r.rev(e[4]), i))
mpm@selenic.com
commands: use node functions directly
r1092 if e[5] != nullid:
mpm@selenic.com
Remove all remaining print statements...
r582 ui.write("\t%d -> %d\n" % (r.rev(e[5]), i))
ui.write("}\n")
mpm@selenic.com
migrate remaining commands...
r248
mpm@selenic.com
Add some rename debugging support
r1116 def debugrename(ui, repo, file, rev=None):
bos@serpentine.internal.keyresearch.com
Add doc string for debugrename.
r1194 """dump rename information"""
mpm@selenic.com
Add some rename debugging support
r1116 r = repo.file(relpath(repo, [file])[0])
if rev:
try:
# assume all revision numbers are for changesets
n = repo.lookup(rev)
change = repo.changelog.read(n)
m = repo.manifest.read(change[0])
n = m[relpath(repo, [file])[0]]
except hg.RepoError, KeyError:
n = r.lookup(rev)
else:
n = r.tip()
m = r.renamed(n)
if m:
ui.write("renamed from %s:%s\n" % (m[0], hex(m[1])))
else:
ui.write("not renamed\n")
Bryan O'Sullivan
Clean up walk and changes code to use normalised names properly....
r820 def debugwalk(ui, repo, *pats, **opts):
Thomas Arendsen Hein
Added missing doc strings for two new debug commmands.
r1053 """show how files match on given patterns"""
Bryan O'Sullivan
Clean up walk and changes code to use normalised names properly....
r820 items = list(walk(repo, pats, opts))
Thomas Arendsen Hein
Cleanups to commands.py
r1065 if not items:
return
Thomas Arendsen Hein
Make debugwalk strip trailing spaces and remove these from test-walk.out
r1309 fmt = '%%s %%-%ds %%-%ds %%s' % (
Bryan O'Sullivan
Modify commands.walk to yield a 4-tuple....
r942 max([len(abs) for (src, abs, rel, exact) in items]),
max([len(rel) for (src, abs, rel, exact) in items]))
for src, abs, rel, exact in items:
Thomas Arendsen Hein
Make debugwalk strip trailing spaces and remove these from test-walk.out
r1309 line = fmt % (src, abs, rel, exact and 'exact' or '')
ui.write("%s\n" % line.rstrip())
Bryan O'Sullivan
Clean up walk and changes code to use normalised names properly....
r820
Bryan O'Sullivan
Convert diff command over to using walk code.
r732 def diff(ui, repo, *pats, **opts):
mpm@selenic.com
hg help: use docstrings only...
r255 """diff working directory (or selected files)"""
mpm@selenic.com
Add automatic binary file detection to diff and export...
r1015 node1, node2 = None, None
revs = [repo.lookup(x) for x in opts['rev']]
Thomas Arendsen Hein
Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli....
r396
mpm@selenic.com
Clean up argument passing for dodiff
r1014 if len(revs) > 0:
node1 = revs[0]
if len(revs) > 1:
node2 = revs[1]
mpm@selenic.com
big heap of command clean-up work...
r245 if len(revs) > 2:
Bryan O'Sullivan
Teach walk code about absolute paths....
r870 raise util.Abort("too many revisions to diff")
mpm@selenic.com
big heap of command clean-up work...
r245
Bryan O'Sullivan
Fix diff command so it doesn't walk the dirstate unnecessarily.
r1267 fns, matchfn, anypats = matchpats(repo, repo.getcwd(), pats, opts)
mpm@selenic.com
Clean up argument passing for dodiff
r1014
Bryan O'Sullivan
Fix diff command so it doesn't walk the dirstate unnecessarily.
r1267 dodiff(sys.stdout, ui, repo, node1, node2, fns, match=matchfn,
mpm@selenic.com
Add automatic binary file detection to diff and export...
r1015 text=opts['text'])
mpm@selenic.com
big heap of command clean-up work...
r245
mpm@selenic.com
[PATCH] New export patch...
r580 def doexport(ui, repo, changeset, seqno, total, revwidth, opts):
mpm@selenic.com
Migrate rawcommit, import, export, history, and merge...
r246 node = repo.lookup(changeset)
prev, other = repo.changelog.parents(node)
change = repo.changelog.read(node)
mpm@selenic.com
[PATCH] New export patch...
r580
Bryan O'Sullivan
Turn make_filename into make_file, which returns a file handle.
r729 fp = make_file(repo, repo.changelog, opts['output'],
node=node, total=total, seqno=seqno,
revwidth=revwidth)
if fp != sys.stdout:
Thomas Arendsen Hein
Show filenames for hg export in verbose mode on a separate lines....
r755 ui.note("%s\n" % fp.name)
mpm@selenic.com
[PATCH] New export patch...
r580
mpm@selenic.com
Remove all remaining print statements...
r582 fp.write("# HG changeset patch\n")
fp.write("# User %s\n" % change[1])
mpm@selenic.com
commands: use node functions directly
r1092 fp.write("# Node ID %s\n" % hex(node))
fp.write("# Parent %s\n" % hex(prev))
if other != nullid:
fp.write("# Parent %s\n" % hex(other))
mpm@selenic.com
Remove all remaining print statements...
r582 fp.write(change[4].rstrip())
fp.write("\n\n")
mpm@selenic.com
[PATCH] New export patch...
r580
mpm@selenic.com
Add automatic binary file detection to diff and export...
r1015 dodiff(fp, ui, repo, prev, node, text=opts['text'])
Thomas Arendsen Hein
Cleanups to commands.py
r1065 if fp != sys.stdout:
fp.close()
Thomas Arendsen Hein
Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli....
r396
mpm@selenic.com
[PATCH] New export patch...
r580 def export(ui, repo, *changesets, **opts):
"""dump the header and diffs for one or more changesets"""
shaleh@speakeasy.net
check export options for changeset before running...
r610 if not changesets:
Bryan O'Sullivan
Teach walk code about absolute paths....
r870 raise util.Abort("export requires at least one changeset")
mpm@selenic.com
[PATCH] New export patch...
r580 seqno = 0
revs = list(revrange(ui, repo, changesets))
total = len(revs)
Thomas Arendsen Hein
Fixed zero-padded filenames with %r if there is a longer number in the middle....
r1067 revwidth = max(map(len, revs))
Thomas Arendsen Hein
Show filenames for hg export in verbose mode on a separate lines....
r755 ui.note(len(revs) > 1 and "Exporting patches:\n" or "Exporting patch:\n")
mpm@selenic.com
[PATCH] New export patch...
r580 for cset in revs:
seqno += 1
doexport(ui, repo, cset, seqno, total, revwidth, opts)
mpm@selenic.com
Migrate rawcommit, import, export, history, and merge...
r246
Bryan O'Sullivan
Move commands.forget over to using new walk code....
r810 def forget(ui, repo, *pats, **opts):
mpm@selenic.com
big heap of command clean-up work...
r245 """don't add the specified files on the next commit"""
Bryan O'Sullivan
Move commands.forget over to using new walk code....
r810 forget = []
Bryan O'Sullivan
Modify commands.walk to yield a 4-tuple....
r942 for src, abs, rel, exact in walk(repo, pats, opts):
Bryan O'Sullivan
Move commands.forget over to using new walk code....
r810 if repo.dirstate.state(abs) == 'a':
forget.append(abs)
Bryan O'Sullivan
Get all commands that operate on files to honour --verbose and --quiet....
r1255 if ui.verbose or not exact:
Thomas Arendsen Hein
Cleanups to commands.py
r1065 ui.status('forgetting ', rel, '\n')
Bryan O'Sullivan
Move commands.forget over to using new walk code....
r810 repo.forget(forget)
mpm@selenic.com
big heap of command clean-up work...
r245
Thomas Arendsen Hein
Remove some options from 'hg grep':...
r1108 def grep(ui, repo, pattern, *pats, **opts):
mpm@selenic.com
Merge from BOS, fix help
r1060 """search for a pattern in specified files and revisions"""
Bryan O'Sullivan
Add grep command....
r1057 reflags = 0
Thomas Arendsen Hein
Cleanups to commands.py
r1065 if opts['ignore_case']:
reflags |= re.I
Bryan O'Sullivan
Add grep command....
r1057 regexp = re.compile(pattern, reflags)
bos@serpentine.internal.keyresearch.com
grep: extend functionality, add man page entry, add unit test....
r1146 sep, eol = ':', '\n'
Thomas Arendsen Hein
Remove some options from 'hg grep':...
r1108 if opts['print0']:
bos@serpentine.internal.keyresearch.com
grep: extend functionality, add man page entry, add unit test....
r1146 sep = eol = '\0'
Bryan O'Sullivan
Add grep command....
r1057
fcache = {}
def getfile(fn):
if fn not in fcache:
fcache[fn] = repo.file(fn)
return fcache[fn]
def matchlines(body):
bos@serpentine.internal.keyresearch.com
grep: speed up matching, and only return one match per line.
r1059 begin = 0
linenum = 0
while True:
match = regexp.search(body, begin)
Thomas Arendsen Hein
Cleanups to commands.py
r1065 if not match:
break
bos@serpentine.internal.keyresearch.com
grep: speed up matching, and only return one match per line.
r1059 mstart, mend = match.span()
linenum += body.count('\n', begin, mstart) + 1
lstart = body.rfind('\n', begin, mstart) + 1 or begin
lend = body.find('\n', mend)
yield linenum, mstart - lstart, mend - lstart, body[lstart:lend]
begin = lend + 1
Bryan O'Sullivan
Add grep command....
r1057
class linestate:
def __init__(self, line, linenum, colstart, colend):
self.line = line
self.linenum = linenum
self.colstart = colstart
self.colend = colend
Thomas Arendsen Hein
Cleanups to commands.py
r1065 def __eq__(self, other):
return self.line == other.line
def __hash__(self):
return hash(self.line)
Bryan O'Sullivan
Add grep command....
r1057
matches = {}
def grepbody(fn, rev, body):
matches[rev].setdefault(fn, {})
m = matches[rev][fn]
for lnum, cstart, cend, line in matchlines(body):
s = linestate(line, lnum, cstart, cend)
m[s] = s
prev = {}
bos@serpentine.internal.keyresearch.com
grep: extend functionality, add man page entry, add unit test....
r1146 ucache = {}
Bryan O'Sullivan
Add grep command....
r1057 def display(fn, rev, states, prevstates):
mpm@selenic.com
Fix set type usage for Python 2.3
r1061 diff = list(sets.Set(states).symmetric_difference(sets.Set(prevstates)))
Bryan O'Sullivan
Add grep command....
r1057 diff.sort(lambda x, y: cmp(x.linenum, y.linenum))
Bryan O'Sullivan
grep: change default to printing first matching rev....
r1145 counts = {'-': 0, '+': 0}
bos@serpentine.internal.keyresearch.com
grep: extend functionality, add man page entry, add unit test....
r1146 filerevmatches = {}
Bryan O'Sullivan
Add grep command....
r1057 for l in diff:
mpm@selenic.com
Change grep -e to grep --all...
r1212 if incrementing or not opts['all']:
Bryan O'Sullivan
Add grep command....
r1057 change = ((l in prevstates) and '-') or '+'
r = rev
else:
change = ((l in states) and '-') or '+'
r = prev[fn]
bos@serpentine.internal.keyresearch.com
grep: extend functionality, add man page entry, add unit test....
r1146 cols = [fn, str(rev)]
if opts['line_number']: cols.append(str(l.linenum))
mpm@selenic.com
Change grep -e to grep --all...
r1212 if opts['all']: cols.append(change)
bos@serpentine.internal.keyresearch.com
Merge with TAH.
r1147 if opts['user']: cols.append(trimuser(ui, getchange(rev)[1], rev,
bos@serpentine.internal.keyresearch.com
grep: extend functionality, add man page entry, add unit test....
r1146 ucache))
if opts['files_with_matches']:
c = (fn, rev)
if c in filerevmatches: continue
filerevmatches[c] = 1
else:
cols.append(l.line)
ui.write(sep.join(cols), eol)
Bryan O'Sullivan
grep: change default to printing first matching rev....
r1145 counts[change] += 1
return counts['+'], counts['-']
Bryan O'Sullivan
Add grep command....
r1057
fstate = {}
Bryan O'Sullivan
grep: change default to printing first matching rev....
r1145 skip = {}
bos@serpentine.internal.keyresearch.com
grep: extend functionality, add man page entry, add unit test....
r1146 changeiter, getchange = walkchangerevs(ui, repo, repo.getcwd(), pats, opts)
count = 0
mpm@selenic.com
Fix up some bugs for log and grep with empty repo
r1337 incrementing = False
bos@serpentine.internal.keyresearch.com
grep: extend functionality, add man page entry, add unit test....
r1146 for st, rev, fns in changeiter:
Bryan O'Sullivan
Add grep command....
r1057 if st == 'window':
incrementing = rev
matches.clear()
elif st == 'add':
change = repo.changelog.read(repo.lookup(str(rev)))
mf = repo.manifest.read(change[0])
matches[rev] = {}
for fn in fns:
Bryan O'Sullivan
grep: change default to printing first matching rev....
r1145 if fn in skip: continue
Bryan O'Sullivan
Add grep command....
r1057 fstate.setdefault(fn, {})
try:
grepbody(fn, rev, getfile(fn).read(mf[fn]))
except KeyError:
pass
elif st == 'iter':
states = matches[rev].items()
states.sort()
for fn, m in states:
Bryan O'Sullivan
grep: change default to printing first matching rev....
r1145 if fn in skip: continue
mpm@selenic.com
Change grep -e to grep --all...
r1212 if incrementing or not opts['all'] or fstate[fn]:
Bryan O'Sullivan
grep: change default to printing first matching rev....
r1145 pos, neg = display(fn, rev, m, fstate[fn])
bos@serpentine.internal.keyresearch.com
grep: extend functionality, add man page entry, add unit test....
r1146 count += pos + neg
mpm@selenic.com
Change grep -e to grep --all...
r1212 if pos and not opts['all']:
Bryan O'Sullivan
grep: change default to printing first matching rev....
r1145 skip[fn] = True
Bryan O'Sullivan
Add grep command....
r1057 fstate[fn] = m
prev[fn] = rev
if not incrementing:
fstate = fstate.items()
fstate.sort()
for fn, state in fstate:
Bryan O'Sullivan
grep: change default to printing first matching rev....
r1145 if fn in skip: continue
Bryan O'Sullivan
Add grep command....
r1057 display(fn, rev, {}, state)
bos@serpentine.internal.keyresearch.com
grep: extend functionality, add man page entry, add unit test....
r1146 return (count == 0 and 1) or 0
Bryan O'Sullivan
Add grep command....
r1057
mason@suse.com
Add searching for named branches...
r898 def heads(ui, repo, **opts):
Thomas Arendsen Hein
Use common output function show_changeset() for hg heads|history|log|tip....
r329 """show current repository heads"""
mason@suse.com
Add searching for named branches...
r898 heads = repo.changelog.heads()
br = None
if opts['branches']:
br = repo.branchlookup(heads)
mpm@selenic.com
Beginning of multi-head support...
r221 for n in repo.changelog.heads():
mason@suse.com
Add searching for named branches...
r898 show_changeset(ui, repo, changenode=n, brinfo=br)
mpm@selenic.com
Beginning of multi-head support...
r221
Thomas Arendsen Hein
added hg identify|id (based on a patch from Andrew Thompson)...
r339 def identify(ui, repo):
"""print information about the working copy"""
mpm@selenic.com
commands: use node functions directly
r1092 parents = [p for p in repo.dirstate.parents() if p != nullid]
Thomas Arendsen Hein
Handle the case where the current working copy is not based on a checkout....
r340 if not parents:
mpm@selenic.com
rework all code using tags...
r343 ui.write("unknown\n")
Thomas Arendsen Hein
Handle the case where the current working copy is not based on a checkout....
r340 return
mpm@selenic.com
commands: use node functions directly
r1092 hexfunc = ui.verbose and hex or short
Bryan O'Sullivan
Work on walk code.
r723 (c, a, d, u) = repo.changes()
Thomas Arendsen Hein
Improvements for hg identify:...
r386 output = ["%s%s" % ('+'.join([hexfunc(parent) for parent in parents]),
(c or a or d) and "+" or "")]
Thomas Arendsen Hein
added hg identify|id (based on a patch from Andrew Thompson)...
r339 if not ui.quiet:
Thomas Arendsen Hein
Improvements for hg identify:...
r386 # multiple tags for a single parent separated by '/'
parenttags = ['/'.join(tags)
for tags in map(repo.nodetags, parents) if tags]
# tags for multiple parents separated by ' + '
Thomas Arendsen Hein
There was an extra space after 'hg id' when there are no tags.
r758 if parenttags:
output.append(' + '.join(parenttags))
Thomas Arendsen Hein
added hg identify|id (based on a patch from Andrew Thompson)...
r339
Thomas Arendsen Hein
Improvements for hg identify:...
r386 ui.write("%s\n" % ' '.join(output))
Thomas Arendsen Hein
added hg identify|id (based on a patch from Andrew Thompson)...
r339
mpm@selenic.com
Commands cleanup...
r437 def import_(ui, repo, patch1, *patches, **opts):
"""import an ordered set of patches"""
patches = (patch1,) + patches
mpm@selenic.com
[PATCH] Clean up destination directory if a clone fails....
r500
mpm@selenic.com
hg import: abort with uncommitted changes, override with --force
r966 if not opts['force']:
(c, a, d, u) = repo.changes()
if c or a or d:
Bryan O'Sullivan
Replace sequences of {ui.warn, return 1} with raise of util.Abort.
r1227 raise util.Abort("outstanding uncommitted changes")
mpm@selenic.com
hg import: abort with uncommitted changes, override with --force
r966
mpm@selenic.com
Commands cleanup...
r437 d = opts["base"]
strip = opts["strip"]
bos@serpentine.internal.keyresearch.com
Fortify the recognition of a diff header.
r1193 mailre = re.compile(r'(?:From |[\w-]+:)')
diffre = re.compile(r'(?:diff -|--- .*\s+\w+ \w+ +\d+ \d+:\d+:\d+ \d+)')
bos@serpentine.internal.keyresearch.com
Make import command reject patches that resemble email messages....
r1190
mpm@selenic.com
Commands cleanup...
r437 for patch in patches:
ui.status("applying %s\n" % patch)
pf = os.path.join(d, patch)
Thomas Arendsen Hein
Changed more occurances of 'text' to 'message'.
r762 message = []
Thomas Arendsen Hein
On importing the result of 'hg export', parse while reading and drop headers....
r701 user = None
hgpatch = False
for line in file(pf):
line = line.rstrip()
mpm@selenic.com
import: fix bug in mail-format detection
r1220 if (not message and not hgpatch and
mailre.match(line) and not opts['force']):
bos@serpentine.internal.keyresearch.com
Make import command reject patches that resemble email messages....
r1190 if len(line) > 35: line = line[:32] + '...'
raise util.Abort('first line looks like a '
'mail header: ' + line)
bos@serpentine.internal.keyresearch.com
Fortify the recognition of a diff header.
r1193 if diffre.match(line):
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 break
Thomas Arendsen Hein
On importing the result of 'hg export', parse while reading and drop headers....
r701 elif hgpatch:
# parse values when importing the result of an hg export
if line.startswith("# User "):
user = line[7:]
ui.debug('User: %s\n' % user)
elif not line.startswith("# ") and line:
Thomas Arendsen Hein
Changed more occurances of 'text' to 'message'.
r762 message.append(line)
Thomas Arendsen Hein
On importing the result of 'hg export', parse while reading and drop headers....
r701 hgpatch = False
elif line == '# HG changeset patch':
mpm@selenic.com
[PATCH] Parse and use header data from an hg export'ed changeset...
r607 hgpatch = True
Samuel Tardieu
Allow HG patch to appear late in the input stream
r852 message = [] # We may have collected garbage
Thomas Arendsen Hein
On importing the result of 'hg export', parse while reading and drop headers....
r701 else:
Thomas Arendsen Hein
Changed more occurances of 'text' to 'message'.
r762 message.append(line)
mpm@selenic.com
[PATCH] Parse and use header data from an hg export'ed changeset...
r607
Thomas Arendsen Hein
Changed more occurances of 'text' to 'message'.
r762 # make sure message isn't empty
if not message:
message = "imported patch %s\n" % patch
Thomas Arendsen Hein
On importing the result of 'hg export', parse while reading and drop headers....
r701 else:
Thomas Arendsen Hein
Changed more occurances of 'text' to 'message'.
r762 message = "%s\n" % '\n'.join(message)
ui.debug('message:\n%s\n' % message)
mpm@selenic.com
Commands cleanup...
r437
Volker Kleinfeld
Make 'hg import' platform independent....
r1285 files = util.patch(strip, pf, ui)
mpm@selenic.com
Commands cleanup...
r437
if len(files) > 0:
addremove(ui, repo, *files)
Thomas Arendsen Hein
Changed more occurances of 'text' to 'message'.
r762 repo.commit(files, message, user)
mpm@selenic.com
Commands cleanup...
r437
TK Soh
Add -p to incoming and outgoing commands to show patch
r1192 def incoming(ui, repo, source="default", **opts):
mpm@selenic.com
hg incoming/outgoing: fix tests and update man page
r928 """show new changesets found in source"""
mpm@selenic.com
Add hg incoming command for local repositories
r927 source = ui.expandpath(source)
other = hg.repository(ui, source)
if not other.local():
Bryan O'Sullivan
Replace sequences of {ui.warn, return 1} with raise of util.Abort.
r1227 raise util.Abort("incoming doesn't work for remote repositories yet")
mpm@selenic.com
Add hg incoming command for local repositories
r927 o = repo.findincoming(other)
mpm@selenic.com
Fix incoming for empty set
r931 if not o:
return
mpm@selenic.com
Add hg incoming command for local repositories
r927 o = other.newer(o)
for n in o:
show_changeset(ui, other, changenode=n)
TK Soh
Add -p to incoming and outgoing commands to show patch
r1192 if opts['patch']:
prev = other.changelog.parents(n)[0]
dodiff(ui, ui, other, prev, n)
ui.write("\n")
mpm@selenic.com
Add hg incoming command for local repositories
r927
Bryan O'Sullivan
Modify init command to take an optional directory to set up....
r907 def init(ui, dest="."):
"""create a new repository in the given directory"""
if not os.path.exists(dest):
os.mkdir(dest)
hg.repository(ui, dest, create=1)
mpm@selenic.com
default path support with .hg/hgrc...
r338
Bryan O'Sullivan
Add locate command....
r627 def locate(ui, repo, *pats, **opts):
"""locate files matching specific patterns"""
Thomas Arendsen Hein
Cleanups to commands.py
r1065 end = opts['print0'] and '\0' or '\n'
mpm@selenic.com
Refactor matchpats and walk...
r742
Bryan O'Sullivan
Modify commands.walk to yield a 4-tuple....
r942 for src, abs, rel, exact in walk(repo, pats, opts, '(?:.*/|)'):
Thomas Arendsen Hein
Cleanups to commands.py
r1065 if repo.dirstate.state(abs) == '?':
continue
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 if opts['fullpath']:
Bryan O'Sullivan
Get add and locate to use new repo and dirstate walk code....
r724 ui.write(os.path.join(repo.root, abs), end)
else:
ui.write(rel, end)
Bryan O'Sullivan
Add locate command....
r627
Bryan O'Sullivan
Rewrite log command. New version is faster and more featureful....
r1031 def log(ui, repo, *pats, **opts):
"""show revision history of entire repository or files"""
Bryan O'Sullivan
Add grep command....
r1057 class dui:
# Implement and delegate some ui protocol. Save hunks of
# output for later display in the desired order.
def __init__(self, ui):
self.ui = ui
self.hunk = {}
def bump(self, rev):
self.rev = rev
self.hunk[rev] = []
def note(self, *args):
Thomas Arendsen Hein
Cleanups to commands.py
r1065 if self.verbose:
self.write(*args)
Bryan O'Sullivan
Add grep command....
r1057 def status(self, *args):
Thomas Arendsen Hein
Cleanups to commands.py
r1065 if not self.quiet:
self.write(*args)
Bryan O'Sullivan
Add grep command....
r1057 def write(self, *args):
self.hunk[self.rev].append(args)
TK Soh
log --debug: fix misplaced manifest field...
r1381 def debug(self, *args):
if self.debugflag:
self.write(*args)
Bryan O'Sullivan
Add grep command....
r1057 def __getattr__(self, key):
return getattr(self.ui, key)
bos@serpentine.internal.keyresearch.com
Fix a small corner of log behaviour....
r1037 cwd = repo.getcwd()
if not pats and cwd:
opts['include'] = [os.path.join(cwd, i) for i in opts['include']]
opts['exclude'] = [os.path.join(cwd, x) for x in opts['exclude']]
bos@serpentine.internal.keyresearch.com
grep: extend functionality, add man page entry, add unit test....
r1146 changeiter, getchange = walkchangerevs(ui, repo, (pats and cwd) or '',
pats, opts)
for st, rev, fns in changeiter:
Bryan O'Sullivan
Add grep command....
r1057 if st == 'window':
Bryan O'Sullivan
Rewrite log command. New version is faster and more featureful....
r1031 du = dui(ui)
Bryan O'Sullivan
Add grep command....
r1057 elif st == 'add':
du.bump(rev)
mason@suse.com
Add log -b to show the branch a specific revision lives in...
r1238 br = None
if opts['branch']:
br = repo.branchlookup([repo.changelog.node(rev)])
Matt Mackall
hg log: add -k for keyword searching
r1373
if opts['keyword']:
changes = repo.changelog.read(repo.changelog.node(rev))
miss = 0
for k in opts['keyword']:
if not (k in changes[1].lower() or
k in changes[4].lower() or
k in " ".join(changes[3][:20]).lower()):
miss = 1
break
if miss:
continue
mason@suse.com
Add log -b to show the branch a specific revision lives in...
r1238 show_changeset(du, repo, rev, brinfo=br)
Bryan O'Sullivan
Add grep command....
r1057 if opts['patch']:
changenode = repo.changelog.node(rev)
prev, other = repo.changelog.parents(changenode)
dodiff(du, du, repo, prev, changenode, fns)
du.write("\n\n")
elif st == 'iter':
for args in du.hunk[rev]:
ui.write(*args)
mpm@selenic.com
hg help: use docstrings only...
r255
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 def manifest(ui, repo, rev=None):
mpm@selenic.com
hg help: use docstrings only...
r255 """output the latest or given revision of the project manifest"""
if rev:
mpm@selenic.com
Make manifest lookup use changeset ids...
r689 try:
# assume all revision numbers are for changesets
n = repo.lookup(rev)
change = repo.changelog.read(n)
n = change[0]
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 except hg.RepoError:
mpm@selenic.com
Make manifest lookup use changeset ids...
r689 n = repo.manifest.lookup(rev)
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 else:
n = repo.manifest.tip()
mpm@selenic.com
hg help: use docstrings only...
r255 m = repo.manifest.read(n)
mpm@selenic.com
add tracking of execute permissions...
r276 mf = repo.manifest.readflags(n)
mpm@selenic.com
hg help: use docstrings only...
r255 files = m.keys()
files.sort()
for f in files:
mpm@selenic.com
commands: use node functions directly
r1092 ui.write("%40s %3s %s\n" % (hex(m[f]), mf[f] and "755" or "644", f))
mpm@selenic.com
hg help: use docstrings only...
r255
TK Soh
Add -p to incoming and outgoing commands to show patch
r1192 def outgoing(ui, repo, dest="default-push", **opts):
mpm@selenic.com
Add hg outgoing command
r920 """show changesets not found in destination"""
dest = ui.expandpath(dest)
other = hg.repository(ui, dest)
o = repo.findoutgoing(other)
o = repo.newer(o)
for n in o:
show_changeset(ui, repo, changenode=n)
TK Soh
Add -p to incoming and outgoing commands to show patch
r1192 if opts['patch']:
prev = repo.changelog.parents(n)[0]
dodiff(ui, ui, repo, prev, n)
ui.write("\n")
mpm@selenic.com
Add hg outgoing command
r920
Thomas Arendsen Hein
Make "hg parents REV" work (again?)...
r706 def parents(ui, repo, rev=None):
"""show the parents of the working dir or revision"""
if rev:
p = repo.changelog.parents(repo.lookup(rev))
mpm@selenic.com
hg help: use docstrings only...
r255 else:
p = repo.dirstate.parents()
for n in p:
mpm@selenic.com
commands: use node functions directly
r1092 if n != nullid:
Thomas Arendsen Hein
Use common output function show_changeset() for hg heads|history|log|tip....
r329 show_changeset(ui, repo, changenode=n)
mpm@selenic.com
hg help: use docstrings only...
r255
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 def paths(ui, search=None):
TK Soh
updated help text and added manpage section for hg paths...
r924 """show definition of symbolic path names"""
mpm@selenic.com
Let hg paths work outside of repositories
r915 try:
repo = hg.repository(ui=ui)
Thomas Arendsen Hein
Cleanups to commands.py
r1065 except hg.RepoError:
mpm@selenic.com
Let hg paths work outside of repositories
r915 pass
TK Soh
Add paths command...
r779 if search:
for name, path in ui.configitems("paths"):
if name == search:
ui.write("%s\n" % path)
return
ui.warn("not found!\n")
return 1
else:
for name, path in ui.configitems("paths"):
ui.write("%s = %s\n" % (name, path))
mpm@selenic.com
[PATCH] Unintuive use...
r404 def pull(ui, repo, source="default", **opts):
mpm@selenic.com
Migrate rawcommit, import, export, history, and merge...
r246 """pull changes from the specified source"""
mpm@selenic.com
[PATCH] Add ui.expandpath command...
r506 source = ui.expandpath(source)
mpm@selenic.com
[PATCH] Unintuive use...
r404 ui.status('pulling from %s\n' % (source))
mpm@selenic.com
[PATCH] Clean up destination directory if a clone fails....
r500
mpm@selenic.com
Add -e and --remotecmd for clone and pull too
r963 if opts['ssh']:
ui.setconfig("ui", "ssh", opts['ssh'])
if opts['remotecmd']:
ui.setconfig("ui", "remotecmd", opts['remotecmd'])
mpm@selenic.com
Migrate rawcommit, import, export, history, and merge...
r246 other = hg.repository(ui, source)
Matt Mackall
Cleanups for repo.pull...
r625 r = repo.pull(other)
if not r:
mpm@selenic.com
[PATCH] Unintuive use...
r404 if opts['update']:
return update(ui, repo)
mpm@selenic.com
[PATCH] New export patch...
r580 else:
mpm@selenic.com
[PATCH] Unintuive use...
r404 ui.status("(run 'hg update' to get a working copy)\n")
return r
mpm@selenic.com
Migrate rawcommit, import, export, history, and merge...
r246
mpm@selenic.com
Add --ssh and --remotecmd to push...
r961 def push(ui, repo, dest="default-push", force=False, ssh=None, remotecmd=None):
mpm@selenic.com
stopgap hg push support...
r319 """push changes to the specified destination"""
mpm@selenic.com
[PATCH] Add ui.expandpath command...
r506 dest = ui.expandpath(dest)
Matt Mackall
Switch push over to the new scheme...
r640 ui.status('pushing to %s\n' % (dest))
mpm@selenic.com
stopgap hg push support...
r319
mpm@selenic.com
Add --ssh and --remotecmd to push...
r961 if ssh:
ui.setconfig("ui", "ssh", ssh)
if remotecmd:
ui.setconfig("ui", "remotecmd", remotecmd)
Matt Mackall
Switch push over to the new scheme...
r640 other = hg.repository(ui, dest)
mpm@selenic.com
Actually implement the -f switch for push
r818 r = repo.push(other, force)
Matt Mackall
Switch push over to the new scheme...
r640 return r
mpm@selenic.com
stopgap hg push support...
r319
mpm@selenic.com
[PATCH] rawcommit fix again...
r403 def rawcommit(ui, repo, *flist, **rc):
mpm@selenic.com
Migrate rawcommit, import, export, history, and merge...
r246 "raw commit interface"
Thomas Arendsen Hein
Added deprecation warnings if -t or --text is used for commits.
r763 if rc['text']:
ui.warn("Warning: -t and --text is deprecated,"
" please use -m or --message instead.\n")
Thomas Arendsen Hein
Changed more occurances of 'text' to 'message'.
r762 message = rc['message'] or rc['text']
if not message and rc['logfile']:
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 try:
Thomas Arendsen Hein
Changed more occurances of 'text' to 'message'.
r762 message = open(rc['logfile']).read()
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 except IOError:
pass
Thomas Arendsen Hein
Changed more occurances of 'text' to 'message'.
r762 if not message and not rc['logfile']:
Bryan O'Sullivan
Replace sequences of {ui.warn, return 1} with raise of util.Abort.
r1227 raise util.Abort("missing commit message")
mpm@selenic.com
Migrate rawcommit, import, export, history, and merge...
r246
mpm@selenic.com
[PATCH] rawcommit fix again...
r403 files = relpath(repo, list(flist))
mpm@selenic.com
Migrate rawcommit, import, export, history, and merge...
r246 if rc['files']:
files += open(rc['files']).read().splitlines()
mpm@selenic.com
rawcommit: do lookup of parents at the appropriate layer...
r452
rc['parent'] = map(repo.lookup, rc['parent'])
mpm@selenic.com
[PATCH] Clean up destination directory if a clone fails....
r500
Bryan O'Sullivan
Commit date validation: more stringent checks, more useful error messages.
r1202 try:
repo.rawcommit(files, message, rc['user'], rc['date'], *rc['parent'])
except ValueError, inst:
raise util.Abort(str(inst))
mpm@selenic.com
[PATCH] Clean up destination directory if a clone fails....
r500
mpm@selenic.com
big heap of command clean-up work...
r245 def recover(ui, repo):
mpm@selenic.com
hg help: use docstrings only...
r255 """roll back an interrupted transaction"""
mpm@selenic.com
big heap of command clean-up work...
r245 repo.recover()
Bryan O'Sullivan
Fix up remove command to use walk code.
r1188 def remove(ui, repo, pat, *pats, **opts):
mpm@selenic.com
big heap of command clean-up work...
r245 """remove the specified files on the next commit"""
Bryan O'Sullivan
Fix up remove command to use walk code.
r1188 names = []
Bryan O'Sullivan
Make removal check more complete and informative.
r1189 def okaytoremove(abs, rel, exact):
c, a, d, u = repo.changes(files = [abs])
reason = None
if c: reason = 'is modified'
elif a: reason = 'has been marked for add'
Bryan O'Sullivan
Add rename/mv command....
r1253 elif u: reason = 'is not managed'
Bryan O'Sullivan
Get all commands that operate on files to honour --verbose and --quiet....
r1255 if reason:
if exact: ui.warn('not removing %s: file %s\n' % (rel, reason))
Bryan O'Sullivan
Make removal check more complete and informative.
r1189 else:
return True
Bryan O'Sullivan
Fix up remove command to use walk code.
r1188 for src, abs, rel, exact in walk(repo, (pat,) + pats, opts):
Bryan O'Sullivan
Make removal check more complete and informative.
r1189 if okaytoremove(abs, rel, exact):
Bryan O'Sullivan
Add rename/mv command....
r1253 if ui.verbose or not exact: ui.status('removing %s\n' % rel)
Bryan O'Sullivan
Fix up remove command to use walk code.
r1188 names.append(abs)
Bryan O'Sullivan
Make remove command really unlink files.
r1247 for name in names:
try:
os.unlink(name)
except OSError, inst:
if inst.errno != errno.ENOENT: raise
Bryan O'Sullivan
Fix up remove command to use walk code.
r1188 repo.remove(names)
mpm@selenic.com
big heap of command clean-up work...
r245
Bryan O'Sullivan
Add rename/mv command....
r1253 def rename(ui, repo, *pats, **opts):
"""rename files; equivalent of copy + remove"""
errs, copied = docopy(ui, repo, pats, opts)
names = []
for abs, rel, exact in copied:
if ui.verbose or not exact: ui.status('removing %s\n' % rel)
try:
os.unlink(rel)
except OSError, inst:
if inst.errno != errno.ENOENT: raise
names.append(abs)
repo.remove(names)
return errs
mpm@selenic.com
[PATCH] hg revert...
r588 def revert(ui, repo, *names, **opts):
"""revert modified files or dirs back to their unmodified states"""
mpm@selenic.com
hg revert should revert to parent, not to tip...
r590 node = opts['rev'] and repo.lookup(opts['rev']) or \
repo.dirstate.parents()[0]
mpm@selenic.com
[PATCH] hg revert...
r588 root = os.path.realpath(repo.root)
mpm@selenic.com
hg revert should revert to parent, not to tip...
r590
mpm@selenic.com
[PATCH] hg revert...
r588 def trimpath(p):
p = os.path.realpath(p)
if p.startswith(root):
rest = p[len(root):]
if not rest:
return rest
if p.startswith(os.sep):
return rest[1:]
return p
mpm@selenic.com
hg revert should revert to parent, not to tip...
r590
mpm@selenic.com
[PATCH] hg revert...
r588 relnames = map(trimpath, names or [os.getcwd()])
chosen = {}
mpm@selenic.com
hg revert should revert to parent, not to tip...
r590
mpm@selenic.com
[PATCH] hg revert...
r588 def choose(name):
def body(name):
for r in relnames:
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 if not name.startswith(r):
continue
mpm@selenic.com
[PATCH] hg revert...
r588 rest = name[len(r):]
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 if not rest:
return r, True
mpm@selenic.com
[PATCH] hg revert...
r588 depth = rest.count(os.sep)
if not r:
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 if depth == 0 or not opts['nonrecursive']:
return r, True
mpm@selenic.com
[PATCH] hg revert...
r588 elif rest[0] == os.sep:
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 if depth == 1 or not opts['nonrecursive']:
return r, True
mpm@selenic.com
[PATCH] hg revert...
r588 return None, False
relname, ret = body(name)
if ret:
chosen[relname] = 1
return ret
r = repo.update(node, False, True, choose, False)
for n in relnames:
if n not in chosen:
ui.warn('error: no matches for %s\n' % n)
r = 1
sys.stdout.flush()
return r
mpm@selenic.com
[PATCH] add "root" command...
r468 def root(ui, repo):
"""print the root (top) of the current working dir"""
ui.write(repo.root + "\n")
mpm@selenic.com
big heap of command clean-up work...
r245 def serve(ui, repo, **opts):
mpm@selenic.com
hg help: use docstrings only...
r255 """export the repository via HTTP"""
Matt Mackall
Add an sshrepository class and hg serve --stdio
r624
if opts["stdio"]:
Matt Mackall
Protocol switch from using generators to stream-like objects....
r635 fin, fout = sys.stdin, sys.stdout
sys.stdout = sys.stderr
Matt Mackall
Add an sshrepository class and hg serve --stdio
r624 def getarg():
Matt Mackall
Protocol switch from using generators to stream-like objects....
r635 argline = fin.readline()[:-1]
Matt Mackall
Add an sshrepository class and hg serve --stdio
r624 arg, l = argline.split()
Matt Mackall
Protocol switch from using generators to stream-like objects....
r635 val = fin.read(int(l))
Matt Mackall
Add an sshrepository class and hg serve --stdio
r624 return arg, val
def respond(v):
Matt Mackall
Protocol switch from using generators to stream-like objects....
r635 fout.write("%d\n" % len(v))
fout.write(v)
fout.flush()
Matt Mackall
Add an sshrepository class and hg serve --stdio
r624
Matt Mackall
Add a scheme for handling remote locking...
r638 lock = None
Matt Mackall
Add an sshrepository class and hg serve --stdio
r624 while 1:
Matt Mackall
Protocol switch from using generators to stream-like objects....
r635 cmd = fin.readline()[:-1]
Matt Mackall
Add an sshrepository class and hg serve --stdio
r624 if cmd == '':
return
if cmd == "heads":
h = repo.heads()
mpm@selenic.com
commands: use node functions directly
r1092 respond(" ".join(map(hex, h)) + "\n")
Matt Mackall
Add a scheme for handling remote locking...
r638 if cmd == "lock":
lock = repo.lock()
respond("")
if cmd == "unlock":
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 if lock:
lock.release()
Matt Mackall
Add a scheme for handling remote locking...
r638 lock = None
respond("")
Matt Mackall
Add an sshrepository class and hg serve --stdio
r624 elif cmd == "branches":
arg, nodes = getarg()
mpm@selenic.com
commands: use node functions directly
r1092 nodes = map(bin, nodes.split(" "))
Matt Mackall
Add an sshrepository class and hg serve --stdio
r624 r = []
for b in repo.branches(nodes):
mpm@selenic.com
commands: use node functions directly
r1092 r.append(" ".join(map(hex, b)) + "\n")
Matt Mackall
Add an sshrepository class and hg serve --stdio
r624 respond("".join(r))
elif cmd == "between":
arg, pairs = getarg()
mpm@selenic.com
commands: use node functions directly
r1092 pairs = [map(bin, p.split("-")) for p in pairs.split(" ")]
Matt Mackall
Add an sshrepository class and hg serve --stdio
r624 r = []
for b in repo.between(pairs):
mpm@selenic.com
commands: use node functions directly
r1092 r.append(" ".join(map(hex, b)) + "\n")
Matt Mackall
Add an sshrepository class and hg serve --stdio
r624 respond("".join(r))
elif cmd == "changegroup":
nodes = []
arg, roots = getarg()
mpm@selenic.com
commands: use node functions directly
r1092 nodes = map(bin, roots.split(" "))
Matt Mackall
Add an sshrepository class and hg serve --stdio
r624
Matt Mackall
Protocol switch from using generators to stream-like objects....
r635 cg = repo.changegroup(nodes)
while 1:
d = cg.read(4096)
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 if not d:
break
Matt Mackall
Protocol switch from using generators to stream-like objects....
r635 fout.write(d)
Matt Mackall
Add an sshrepository class and hg serve --stdio
r624
mark.williamson@cl.cam.ac.uk
A number of minor fixes to problems that pychecker found....
r667 fout.flush()
Matt Mackall
Add an sshrepository class and hg serve --stdio
r624
Matt Mackall
Add addchangegroup to the ssh protocol
r639 elif cmd == "addchangegroup":
if not lock:
respond("not locked")
continue
respond("")
r = repo.addchangegroup(fin)
respond("")
mpm@selenic.com
hgweb: change startup argument processing...
r987 optlist = "name templates style address port ipv6 accesslog errorlog"
for o in optlist.split():
if opts[o]:
ui.setconfig("web", o, opts[o])
Bryan O'Sullivan
hg serve: print a more useful error message if server can't start.
r1177 try:
httpd = hgweb.create_server(repo)
except socket.error, inst:
raise util.Abort('cannot start server: ' + inst.args[1])
mpm@selenic.com
hgweb: change startup argument processing...
r987
mpm@selenic.com
[PATCH] Get "hg serve" to print the URL being served...
r603 if ui.verbose:
addr, port = httpd.socket.getsockname()
if addr == '0.0.0.0':
addr = socket.gethostname()
else:
try:
addr = socket.gethostbyaddr(addr)[0]
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 except socket.error:
pass
mpm@selenic.com
[PATCH] Get "hg serve" to print the URL being served...
r603 if port != 80:
mpm@selenic.com
[PATCH] Get "hg serve" to optionally log accesses and errors to files...
r605 ui.status('listening at http://%s:%d/\n' % (addr, port))
mpm@selenic.com
[PATCH] Get "hg serve" to print the URL being served...
r603 else:
mpm@selenic.com
[PATCH] Get "hg serve" to optionally log accesses and errors to files...
r605 ui.status('listening at http://%s/\n' % addr)
mpm@selenic.com
[PATCH] Get "hg serve" to print the URL being served...
r603 httpd.serve_forever()
mpm@selenic.com
[PATCH] Clean up destination directory if a clone fails....
r500
Bryan O'Sullivan
Add name matching to status command.
r731 def status(ui, repo, *pats, **opts):
mpm@selenic.com
commands: migrate status and branch...
r213 '''show changed files in the working directory
mpm@selenic.com
Change C to M in status
r746 M = modified
mpm@selenic.com
big heap of command clean-up work...
r245 A = added
R = removed
Thomas Arendsen Hein
Rewritten change type selection for hg status.
r842 ? = not tracked
'''
mpm@selenic.com
Optimize diff and status in subdirectories...
r312
Bryan O'Sullivan
Clean up walk and changes code to use normalised names properly....
r820 cwd = repo.getcwd()
Bryan O'Sullivan
Rewrite log command. New version is faster and more featureful....
r1031 files, matchfn, anypats = matchpats(repo, cwd, pats, opts)
Bryan O'Sullivan
Fix walk code for files that do not exist anywhere, and unhandled types....
r884 (c, a, d, u) = [[util.pathto(cwd, x) for x in n]
Thomas Arendsen Hein
Use list comprehension in hg status.
r823 for n in repo.changes(files=files, match=matchfn)]
mpm@selenic.com
commands: migrate status and branch...
r213
Thomas Arendsen Hein
Rewritten change type selection for hg status.
r842 changetypes = [('modified', 'M', c),
('added', 'A', a),
('removed', 'R', d),
('unknown', '?', u)]
TK Soh
status: added option -p and -0 to assist xargs...
r1085 end = opts['print0'] and '\0' or '\n'
Thomas Arendsen Hein
Whitespace cleanup.
r1106
Thomas Arendsen Hein
Rewritten change type selection for hg status.
r842 for opt, char, changes in ([ct for ct in changetypes if opts[ct[0]]]
or changetypes):
Thomas Arendsen Hein
Replaced hg status -p/--strip with -n/--no-status to not confuse with patch.
r1105 if opts['no_status']:
TK Soh
status: added option -p and -0 to assist xargs...
r1085 format = "%%s%s" % end
else:
format = "%s %%s%s" % (char, end);
Thomas Arendsen Hein
Whitespace cleanup.
r1106
Thomas Arendsen Hein
Rewritten change type selection for hg status.
r842 for f in changes:
TK Soh
status: added option -p and -0 to assist xargs...
r1085 ui.write(format % f)
mpm@selenic.com
commands: migrate status and branch...
r213
Thomas Arendsen Hein
Removed extra spaces for default parameters according to PEP8....
r700 def tag(ui, repo, name, rev=None, **opts):
mpm@selenic.com
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>...
r401 """add a tag for the current tip or a given revision"""
Thomas Arendsen Hein
Added deprecation warnings if -t or --text is used for commits.
r763 if opts['text']:
ui.warn("Warning: -t and --text is deprecated,"
" please use -m or --message instead.\n")
mpm@selenic.com
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>...
r401 if name == "tip":
Bryan O'Sullivan
Replace sequences of {ui.warn, return 1} with raise of util.Abort.
r1227 raise util.Abort("the name 'tip' is reserved")
Matt Mackall
[PATCH] hg tag: local tag support in file .hg/localtags...
r609 if rev:
mpm@selenic.com
commands: use node functions directly
r1092 r = hex(repo.lookup(rev))
Matt Mackall
[PATCH] hg tag: local tag support in file .hg/localtags...
r609 else:
mpm@selenic.com
commands: use node functions directly
r1092 r = hex(repo.changelog.tip())
Matt Mackall
[PATCH] hg tag: local tag support in file .hg/localtags...
r609
mpm@selenic.com
[PATCH] New export patch...
r580 if name.find(revrangesep) >= 0:
Bryan O'Sullivan
Replace sequences of {ui.warn, return 1} with raise of util.Abort.
r1227 raise util.Abort("'%s' cannot be used in a tag name" % revrangesep)
mpm@selenic.com
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>...
r401
Matt Mackall
[PATCH] hg tag: local tag support in file .hg/localtags...
r609 if opts['local']:
repo.opener("localtags", "a").write("%s %s\n" % (r, name))
return
Bryan O'Sullivan
Work on walk code.
r723 (c, a, d, u) = repo.changes()
mpm@selenic.com
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>...
r401 for x in (c, a, d, u):
mpm@selenic.com
[PATCH] New export patch...
r580 if ".hgtags" in x:
Bryan O'Sullivan
Replace sequences of {ui.warn, return 1} with raise of util.Abort.
r1227 raise util.Abort("working copy of .hgtags is changed "
"(please commit .hgtags manually)")
mpm@selenic.com
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>...
r401
thananck@yahoo.com
open .hgtags as binary...
r617 repo.wfile(".hgtags", "ab").write("%s %s\n" % (r, name))
Thomas Arendsen Hein
Use dirstate to check if .hgtags needs to be added....
r710 if repo.dirstate.state(".hgtags") == '?':
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 repo.add([".hgtags"])
mpm@selenic.com
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>...
r401
Thomas Arendsen Hein
Changed more occurances of 'text' to 'message'.
r762 message = (opts['message'] or opts['text'] or
"Added tag %s for changeset %s" % (name, r))
Bryan O'Sullivan
Commit date validation: more stringent checks, more useful error messages.
r1202 try:
repo.commit([".hgtags"], message, opts['user'], opts['date'])
except ValueError, inst:
raise util.Abort(str(inst))
mpm@selenic.com
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>...
r401
mpm@selenic.com
migrate remaining commands...
r248 def tags(ui, repo):
mpm@selenic.com
hg help: use docstrings only...
r255 """list repository tags"""
Thomas Arendsen Hein
Handle errors in .hgtags or hgrc [tags] section more gracefully....
r477
mpm@selenic.com
rework all code using tags...
r343 l = repo.tagslist()
l.reverse()
Thomas Arendsen Hein
Handle errors in .hgtags or hgrc [tags] section more gracefully....
r477 for t, n in l:
mpm@selenic.com
migrate remaining commands...
r248 try:
mpm@selenic.com
commands: use node functions directly
r1092 r = "%5d:%s" % (repo.changelog.rev(n), hex(n))
mpm@selenic.com
migrate remaining commands...
r248 except KeyError:
Thomas Arendsen Hein
Handle errors in .hgtags or hgrc [tags] section more gracefully....
r477 r = " ?:?"
ui.write("%-30s %s\n" % (t, r))
mpm@selenic.com
migrate remaining commands...
r248
mpm@selenic.com
big heap of command clean-up work...
r245 def tip(ui, repo):
mpm@selenic.com
hg help: use docstrings only...
r255 """show the tip revision"""
mpm@selenic.com
big heap of command clean-up work...
r245 n = repo.changelog.tip()
Thomas Arendsen Hein
Use common output function show_changeset() for hg heads|history|log|tip....
r329 show_changeset(ui, repo, changenode=n)
mpm@selenic.com
big heap of command clean-up work...
r245
mpm@selenic.com
Add preliminary support for the bundle and unbundle commands
r1218 def unbundle(ui, repo, fname):
mpm@selenic.com
Fix missing docstring for unbundle
r1222 """apply a changegroup file"""
mpm@selenic.com
Add preliminary support for the bundle and unbundle commands
r1218 f = urllib.urlopen(fname)
if f.read(4) != "HG10":
Bryan O'Sullivan
Replace sequences of {ui.warn, return 1} with raise of util.Abort.
r1227 raise util.Abort("%s: not a Mercurial bundle file" % fname)
mpm@selenic.com
Add preliminary support for the bundle and unbundle commands
r1218
Eric Hopper
Fix hg unbundle chunking performance bug
r1374 def bzgenerator(f):
zd = bz2.BZ2Decompressor()
for chunk in f:
yield zd.decompress(chunk)
yield zd.flush()
mpm@selenic.com
Add preliminary support for the bundle and unbundle commands
r1218
Eric Hopper
Fix hg unbundle chunking performance bug
r1374 bzgen = bzgenerator(util.filechunkiter(f, 4096))
repo.addchangegroup(util.chunkbuffer(bzgen))
mpm@selenic.com
Add preliminary support for the bundle and unbundle commands
r1218
mpm@selenic.com
commands: better argument processing, per-command help...
r212 def undo(ui, repo):
mpm@selenic.com
A bunch of parsing/help updates...
r596 """undo the last commit or pull
Roll back the last pull or commit transaction on the
repository, restoring the project to its earlier state.
This command should be used with care. There is only one level of
undo and there is no redo.
This command is not intended for use on public repositories. Once
a change is visible for pull by other users, undoing it locally is
ineffective.
"""
mpm@selenic.com
hg undo: fixup working dir state...
r210 repo.undo()
mason@suse.com
Add searching for named branches...
r898 def update(ui, repo, node=None, merge=False, clean=False, branch=None):
mpm@selenic.com
unify checkout and resolve into update...
r254 '''update or merge working directory
If there are no outstanding changes in the working directory and
there is a linear relationship between the current version and the
requested version, the result is the requested version.
Otherwise the result is a merge between the contents of the
current working directory and the requested version. Files that
changed between either parent are marked as changed for the next
commit and a commit must be performed before any further updates
are allowed.
'''
mason@suse.com
Add searching for named branches...
r898 if branch:
br = repo.branchlookup(branch=branch)
found = []
for x in br:
if branch in br[x]:
found.append(x)
if len(found) > 1:
ui.warn("Found multiple heads for %s\n" % branch)
for x in found:
show_changeset(ui, repo, changenode=x, brinfo=br)
return 1
if len(found) == 1:
node = found[0]
mpm@selenic.com
commands: use node functions directly
r1092 ui.warn("Using head %s for branch %s\n" % (short(node), branch))
mason@suse.com
Add searching for named branches...
r898 else:
ui.warn("branch %s not found\n" % (branch))
return 1
else:
node = node and repo.lookup(node) or repo.changelog.tip()
mpm@selenic.com
various merge improvements...
r275 return repo.update(node, allow=merge, force=clean)
mpm@selenic.com
unify checkout and resolve into update...
r254
mpm@selenic.com
migrate verify...
r247 def verify(ui, repo):
"""verify the integrity of the repository"""
return repo.verify()
mpm@selenic.com
hg help: use docstrings only...
r255 # Command options and aliases are listed here, alphabetically
mpm@selenic.com
Beginning of new command parsing interface...
r209 table = {
Thomas Arendsen Hein
Realigned command table again.
r841 "^add":
(add,
[('I', 'include', [], 'include path in search'),
('X', 'exclude', [], 'exclude path from search')],
TK Soh
typo fix in command help text...
r913 "hg add [OPTION]... [FILE]..."),
Thomas Arendsen Hein
Realigned command table again.
r841 "addremove":
(addremove,
[('I', 'include', [], 'include path in search'),
('X', 'exclude', [], 'exclude path from search')],
"hg addremove [OPTION]... [FILE]..."),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 "^annotate":
(annotate,
Thomas Arendsen Hein
Updated help strings and test-help:...
r757 [('r', 'rev', '', 'revision'),
mpm@selenic.com
Teach annotate about binary files
r1016 ('a', 'text', None, 'treat all files as text'),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 ('u', 'user', None, 'show user'),
('n', 'number', None, 'show revision number'),
Thomas Arendsen Hein
Updated help strings and test-help:...
r757 ('c', 'changeset', None, 'show changeset'),
('I', 'include', [], 'include path in search'),
('X', 'exclude', [], 'exclude path from search')],
TK Soh
typo fix in command help text...
r913 'hg annotate [OPTION]... FILE...'),
mpm@selenic.com
Add preliminary support for the bundle and unbundle commands
r1218 "bundle":
(bundle,
[],
'hg bundle FILE DEST'),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 "cat":
(cat,
Bryan O'Sullivan
Switch cat command to use walk code....
r1254 [('I', 'include', [], 'include path in search'),
('X', 'exclude', [], 'exclude path from search'),
('o', 'output', "", 'output to file'),
('r', 'rev', '', 'revision')],
'hg cat [OPTION]... FILE...'),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 "^clone":
(clone,
mpm@selenic.com
Add -e and --remotecmd for clone and pull too
r963 [('U', 'noupdate', None, 'skip update after cloning'),
('e', 'ssh', "", 'ssh command'),
Bryan O'Sullivan
Add --pull option to clone.
r1281 ('', 'pull', None, 'use pull protocol to copy metadata'),
mpm@selenic.com
Add -e and --remotecmd for clone and pull too
r963 ('', 'remotecmd', "", 'remote hg command')],
Thomas Arendsen Hein
Fixed some synopsises in command help.
r1054 'hg clone [OPTION]... SOURCE [DEST]'),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 "^commit|ci":
(commit,
Thomas Arendsen Hein
Changed command synopsises to match style of common UNIX tools....
r707 [('A', 'addremove', None, 'run add/remove during commit'),
Bryan O'Sullivan
Adapt commit to use file matching code....
r813 ('I', 'include', [], 'include path in search'),
('X', 'exclude', [], 'exclude path from search'),
Andrew Thompson
Change all references to -t --text commit message to -m and --message.
r761 ('m', 'message', "", 'commit message'),
Thomas Arendsen Hein
Updated help strings and test-help:...
r757 ('t', 'text', "", 'commit message (deprecated: use -m)'),
Thomas Arendsen Hein
Changed more occurances of 'text' to 'message'.
r762 ('l', 'logfile', "", 'commit message file'),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 ('d', 'date', "", 'date code'),
('u', 'user', "", 'user')],
Thomas Arendsen Hein
Changed command synopsises to match style of common UNIX tools....
r707 'hg commit [OPTION]... [FILE]...'),
Bryan O'Sullivan
Fix up copy command to behave more like regular "cp"....
r1249 "copy|cp": (copy,
[('I', 'include', [], 'include path in search'),
('X', 'exclude', [], 'exclude path from search'),
('A', 'after', None, 'record a copy after it has happened'),
('f', 'force', None, 'replace destination if it exists'),
('p', 'parents', None, 'append source path to dest')],
'hg copy [OPTION]... [SOURCE]... DEST'),
mpm@selenic.com
Add debugancestor command
r1262 "debugancestor": (debugancestor, [], 'debugancestor INDEX REV1 REV2'),
mpm@selenic.com
A bunch of parsing/help updates...
r596 "debugcheckstate": (debugcheckstate, [], 'debugcheckstate'),
Bryan O'Sullivan
Add commands.debugconfig....
r1028 "debugconfig": (debugconfig, [], 'debugconfig'),
mpm@selenic.com
A bunch of parsing/help updates...
r596 "debugstate": (debugstate, [], 'debugstate'),
mpm@selenic.com
Add debugdata for dumping revlog revision data
r1039 "debugdata": (debugdata, [], 'debugdata FILE REV'),
Thomas Arendsen Hein
Changed command synopsises to match style of common UNIX tools....
r707 "debugindex": (debugindex, [], 'debugindex FILE'),
"debugindexdot": (debugindexdot, [], 'debugindexdot FILE'),
mpm@selenic.com
Add some rename debugging support
r1116 "debugrename": (debugrename, [], 'debugrename FILE [REV]'),
Thomas Arendsen Hein
Realigned command table again.
r841 "debugwalk":
(debugwalk,
[('I', 'include', [], 'include path in search'),
('X', 'exclude', [], 'exclude path from search')],
TK Soh
typo fix in command help text...
r913 'debugwalk [OPTION]... [FILE]...'),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 "^diff":
(diff,
Thomas Arendsen Hein
Updated help strings and test-help:...
r757 [('r', 'rev', [], 'revision'),
mpm@selenic.com
Add automatic binary file detection to diff and export...
r1015 ('a', 'text', None, 'treat all files as text'),
Thomas Arendsen Hein
Updated help strings and test-help:...
r757 ('I', 'include', [], 'include path in search'),
('X', 'exclude', [], 'exclude path from search')],
Thomas Arendsen Hein
Fixed some synopsises in command help.
r1054 'hg diff [-a] [-I] [-X] [-r REV1 [-r REV2]] [FILE]...'),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 "^export":
(export,
mpm@selenic.com
Add automatic binary file detection to diff and export...
r1015 [('o', 'output', "", 'output to file'),
('a', 'text', None, 'treat all files as text')],
Thomas Arendsen Hein
Fixed some synopsises in command help.
r1054 "hg export [-a] [-o OUTFILE] REV..."),
Thomas Arendsen Hein
Realigned command table again.
r841 "forget":
(forget,
[('I', 'include', [], 'include path in search'),
('X', 'exclude', [], 'exclude path from search')],
TK Soh
typo fix in command help text...
r913 "hg forget [OPTION]... FILE..."),
Thomas Arendsen Hein
Cleanups to commands.py
r1065 "grep":
(grep,
bos@serpentine.internal.keyresearch.com
grep: extend functionality, add man page entry, add unit test....
r1146 [('0', 'print0', None, 'end fields with NUL'),
Thomas Arendsen Hein
Cleanups to commands.py
r1065 ('I', 'include', [], 'include path in search'),
('X', 'exclude', [], 'include path in search'),
mpm@selenic.com
Change grep -e to grep --all...
r1212 ('', 'all', None, 'print all revisions with matches'),
Thomas Arendsen Hein
Cleanups to commands.py
r1065 ('i', 'ignore-case', None, 'ignore case when matching'),
bos@serpentine.internal.keyresearch.com
grep: extend functionality, add man page entry, add unit test....
r1146 ('l', 'files-with-matches', None, 'print names of files and revs with matches'),
('n', 'line-number', None, 'print line numbers'),
('r', 'rev', [], 'search in revision rev'),
('u', 'user', None, 'print user who made change')],
Thomas Arendsen Hein
Remove some options from 'hg grep':...
r1108 "hg grep [OPTION]... PATTERN [FILE]..."),
Thomas Arendsen Hein
Update online help of hg heads for new --branches option.
r905 "heads":
(heads,
[('b', 'branches', None, 'find branch info')],
Thomas Arendsen Hein
Fixed some synopsises in command help.
r1054 'hg heads [-b]'),
Thomas Arendsen Hein
Changed command synopsises to match style of common UNIX tools....
r707 "help": (help_, [], 'hg help [COMMAND]'),
Thomas Arendsen Hein
added hg identify|id (based on a patch from Andrew Thompson)...
r339 "identify|id": (identify, [], 'hg identify'),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 "import|patch":
(import_,
[('p', 'strip', 1, 'path strip'),
mpm@selenic.com
hg import: abort with uncommitted changes, override with --force
r966 ('f', 'force', None, 'skip check for outstanding changes'),
mpm@selenic.com
Fold import -m option into import -f
r1211 ('b', 'base', "", 'base path')],
Thomas Arendsen Hein
Fixed some synopsises in command help.
r1054 "hg import [-f] [-p NUM] [-b BASE] PATCH..."),
Bryan O'Sullivan
Add rename/mv command....
r1253 "incoming|in": (incoming,
TK Soh
Add -p to incoming and outgoing commands to show patch
r1192 [('p', 'patch', None, 'show patch')],
'hg incoming [-p] [SOURCE]'),
Bryan O'Sullivan
Modify init command to take an optional directory to set up....
r907 "^init": (init, [], 'hg init [DEST]'),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 "locate":
(locate,
Thomas Arendsen Hein
Updated help strings and test-help:...
r757 [('r', 'rev', '', 'revision'),
TK Soh
Updated manpage and help....
r1113 ('0', 'print0', None, 'end filenames with NUL'),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 ('f', 'fullpath', None, 'print complete paths'),
Bryan O'Sullivan
Get add and locate to use new repo and dirstate walk code....
r724 ('I', 'include', [], 'include path in search'),
('X', 'exclude', [], 'exclude path from search')],
TK Soh
typo fix in command help text...
r913 'hg locate [OPTION]... [PATTERN]...'),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 "^log|history":
(log,
Bryan O'Sullivan
Rewrite log command. New version is faster and more featureful....
r1031 [('I', 'include', [], 'include path in search'),
('X', 'exclude', [], 'exclude path from search'),
mason@suse.com
Add log -b to show the branch a specific revision lives in...
r1238 ('b', 'branch', None, 'show branches'),
Matt Mackall
hg log: add -k for keyword searching
r1373 ('k', 'keyword', [], 'search for a keyword'),
Bryan O'Sullivan
Rewrite log command. New version is faster and more featureful....
r1031 ('r', 'rev', [], 'revision'),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 ('p', 'patch', None, 'show patch')],
Thomas Arendsen Hein
Fixed some synopsises in command help.
r1054 'hg log [-I] [-X] [-r REV]... [-p] [FILE]'),
Thomas Arendsen Hein
Changed command synopsises to match style of common UNIX tools....
r707 "manifest": (manifest, [], 'hg manifest [REV]'),
Bryan O'Sullivan
Add rename/mv command....
r1253 "outgoing|out": (outgoing,
TK Soh
Add -p to incoming and outgoing commands to show patch
r1192 [('p', 'patch', None, 'show patch')],
'hg outgoing [-p] [DEST]'),
Thomas Arendsen Hein
Changed command synopsises to match style of common UNIX tools....
r707 "parents": (parents, [], 'hg parents [REV]'),
TK Soh
updated help text and added manpage section for hg paths...
r924 "paths": (paths, [], 'hg paths [NAME]'),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 "^pull":
(pull,
mpm@selenic.com
Add -e and --remotecmd for clone and pull too
r963 [('u', 'update', None, 'update working directory'),
('e', 'ssh', "", 'ssh command'),
('', 'remotecmd', "", 'remote hg command')],
Thomas Arendsen Hein
Fixed some synopsises in command help.
r1054 'hg pull [-u] [-e FILE] [--remotecmd FILE] [SOURCE]'),
mpm@selenic.com
Actually implement the -f switch for push
r818 "^push":
(push,
mpm@selenic.com
Add --ssh and --remotecmd to push...
r961 [('f', 'force', None, 'force push'),
('e', 'ssh', "", 'ssh command'),
('', 'remotecmd', "", 'remote hg command')],
Thomas Arendsen Hein
Fixed some synopsises in command help.
r1054 'hg push [-f] [-e FILE] [--remotecmd FILE] [DEST]'),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 "rawcommit":
(rawcommit,
[('p', 'parent', [], 'parent'),
('d', 'date', "", 'date code'),
('u', 'user', "", 'user'),
('F', 'files', "", 'file list'),
Thomas Arendsen Hein
Changed more occurances of 'text' to 'message'.
r762 ('m', 'message', "", 'commit message'),
('t', 'text', "", 'commit message (deprecated: use -m)'),
('l', 'logfile', "", 'commit message file')],
Thomas Arendsen Hein
Changed command synopsises to match style of common UNIX tools....
r707 'hg rawcommit [OPTION]... [FILE]...'),
mpm@selenic.com
big heap of command clean-up work...
r245 "recover": (recover, [], "hg recover"),
Bryan O'Sullivan
Fix up remove command to use walk code.
r1188 "^remove|rm": (remove,
[('I', 'include', [], 'include path in search'),
('X', 'exclude', [], 'exclude path from search')],
"hg remove [OPTION]... FILE..."),
Bryan O'Sullivan
Add rename/mv command....
r1253 "rename|mv": (rename,
[('I', 'include', [], 'include path in search'),
('X', 'exclude', [], 'exclude path from search'),
('A', 'after', None, 'record a copy after it has happened'),
('f', 'force', None, 'replace destination if it exists'),
('p', 'parents', None, 'append source path to dest')],
'hg rename [OPTION]... [SOURCE]... DEST'),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 "^revert":
(revert,
[("n", "nonrecursive", None, "don't recurse into subdirs"),
("r", "rev", "", "revision")],
Thomas Arendsen Hein
Updated help strings and test-help:...
r757 "hg revert [-n] [-r REV] [NAME]..."),
mpm@selenic.com
[PATCH] add "root" command...
r468 "root": (root, [], "hg root"),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 "^serve":
(serve,
[('A', 'accesslog', '', 'access log file'),
('E', 'errorlog', '', 'error log file'),
mpm@selenic.com
hgweb: add [web] section to hgrc...
r938 ('p', 'port', 0, 'listen port'),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 ('a', 'address', '', 'interface address'),
mpm@selenic.com
hgweb: add [web] section to hgrc...
r938 ('n', 'name', "", 'repository name'),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 ('', 'stdio', None, 'for remote clients'),
mpm@selenic.com
hgweb: change startup argument processing...
r987 ('t', 'templates', "", 'template directory'),
('', 'style', "", 'template style'),
Samuel Tardieu
Add an option to hg serve to serve file using IPv6
r825 ('6', 'ipv6', None, 'use IPv6 in addition to IPv4')],
Thomas Arendsen Hein
Changed command synopsises to match style of common UNIX tools....
r707 "hg serve [OPTION]..."),
tksoh@users.sourceforge.net
hg status: added options to select files by status....
r840 "^status":
(status,
[('m', 'modified', None, 'show only modified files'),
('a', 'added', None, 'show only added files'),
('r', 'removed', None, 'show only removed files'),
('u', 'unknown', None, 'show only unknown (not tracked) files'),
Thomas Arendsen Hein
Replaced hg status -p/--strip with -n/--no-status to not confuse with patch.
r1105 ('n', 'no-status', None, 'hide status prefix'),
TK Soh
Updated manpage and help....
r1113 ('0', 'print0', None, 'end filenames with NUL'),
tksoh@users.sourceforge.net
hg status: added options to select files by status....
r840 ('I', 'include', [], 'include path in search'),
('X', 'exclude', [], 'exclude path from search')],
TK Soh
typo fix in command help text...
r913 "hg status [OPTION]... [FILE]..."),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 "tag":
(tag,
[('l', 'local', None, 'make the tag local'),
Thomas Arendsen Hein
Changed more occurances of 'text' to 'message'.
r762 ('m', 'message', "", 'commit message'),
('t', 'text', "", 'commit message (deprecated: use -m)'),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 ('d', 'date', "", 'date code'),
('u', 'user', "", 'user')],
Thomas Arendsen Hein
Changed command synopsises to match style of common UNIX tools....
r707 'hg tag [OPTION]... NAME [REV]'),
mpm@selenic.com
migrate remaining commands...
r248 "tags": (tags, [], 'hg tags'),
mpm@selenic.com
big heap of command clean-up work...
r245 "tip": (tip, [], 'hg tip'),
mpm@selenic.com
Add preliminary support for the bundle and unbundle commands
r1218 "unbundle":
(unbundle,
[],
'hg unbundle FILE'),
mpm@selenic.com
hg undo: fixup working dir state...
r210 "undo": (undo, [], 'hg undo'),
mpm@selenic.com
Shorten help...
r593 "^update|up|checkout|co":
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 (update,
mason@suse.com
Add searching for named branches...
r898 [('b', 'branch', "", 'checkout the head of a specific branch'),
('m', 'merge', None, 'allow merging of conflicts'),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 ('C', 'clean', None, 'overwrite locally modified files')],
Thomas Arendsen Hein
Update synopsis for 'hg update', too.
r906 'hg update [-b TAG] [-m] [-C] [REV]'),
mpm@selenic.com
migrate verify...
r247 "verify": (verify, [], 'hg verify'),
mpm@selenic.com
Fix up version module name and command conflict...
r470 "version": (show_version, [], 'hg version'),
Thomas Arendsen Hein
Sort global options by topic: directories, ui, timing, other...
r1046 }
mpm@selenic.com
Beginning of new command parsing interface...
r209
Thomas Arendsen Hein
Sort global options by topic: directories, ui, timing, other...
r1046 globalopts = [
('R', 'repository', "", 'repository root directory'),
('', 'cwd', '', 'change working directory'),
('y', 'noninteractive', None, 'run non-interactively'),
('q', 'quiet', None, 'quiet mode'),
('v', 'verbose', None, 'verbose mode'),
('', 'debug', None, 'debug mode'),
mpm@selenic.com
Add --debugger global option...
r1225 ('', 'debugger', None, 'start debugger'),
Thomas Arendsen Hein
Sort global options by topic: directories, ui, timing, other...
r1046 ('', 'traceback', None, 'print traceback on exception'),
('', 'time', None, 'time how long the command takes'),
('', 'profile', None, 'profile'),
('', 'version', None, 'output version information and exit'),
Thomas Arendsen Hein
Added options -h/--help.
r1048 ('h', 'help', None, 'display help and exit'),
Thomas Arendsen Hein
Sort global options by topic: directories, ui, timing, other...
r1046 ]
mpm@selenic.com
A bunch of parsing/help updates...
r596
mpm@selenic.com
Add debugancestor command
r1262 norepo = ("clone init version help debugancestor debugconfig debugdata"
Thomas Arendsen Hein
Cleanups to commands.py
r1065 " debugindex debugindexdot paths")
mpm@selenic.com
Beginning of new command parsing interface...
r209
mpm@selenic.com
commands: better argument processing, per-command help...
r212 def find(cmd):
for e in table.keys():
mpm@selenic.com
Fix misrecognition of commands...
r335 if re.match("(%s)$" % e, cmd):
Thomas Arendsen Hein
Further help improvements:...
r849 return e, table[e]
mpm@selenic.com
commands: better argument processing, per-command help...
r212
raise UnknownCommand(cmd)
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 class SignalInterrupt(Exception):
"""Exception raised on SIGTERM and SIGHUP."""
mpm@selenic.com
catch TERM signal in command processor...
r214
def catchterm(*args):
raise SignalInterrupt
mpm@selenic.com
import and startup cleanups...
r249 def run():
sys.exit(dispatch(sys.argv[1:]))
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 class ParseError(Exception):
"""Exception raised on errors in parsing the command line."""
mpm@selenic.com
Restructure option handling...
r592
mpm@selenic.com
A bunch of parsing/help updates...
r596 def parse(args):
mpm@selenic.com
Beginning of new command parsing interface...
r209 options = {}
mpm@selenic.com
A bunch of parsing/help updates...
r596 cmdoptions = {}
mpm@selenic.com
Beginning of new command parsing interface...
r209
mpm@selenic.com
Restructure option handling...
r592 try:
mpm@selenic.com
A bunch of parsing/help updates...
r596 args = fancyopts.fancyopts(args, globalopts, options)
mpm@selenic.com
Restructure option handling...
r592 except fancyopts.getopt.GetoptError, inst:
Bryan O'Sullivan
Handle unrecognised options correctly....
r618 raise ParseError(None, inst)
mpm@selenic.com
Beginning of new command parsing interface...
r209
Thomas Arendsen Hein
Moved special handling of --version and no hg command from parse to dispatch....
r1047 if args:
cmd, args = args[0], args[1:]
i = find(cmd)[1]
c = list(i[1])
mpm@selenic.com
Beginning of new command parsing interface...
r209 else:
Thomas Arendsen Hein
Moved special handling of --version and no hg command from parse to dispatch....
r1047 cmd = None
c = []
mpm@selenic.com
Beginning of new command parsing interface...
r209
mpm@selenic.com
Restructure option handling...
r592 # combine global options into local
mpm@selenic.com
A bunch of parsing/help updates...
r596 for o in globalopts:
mpm@selenic.com
Restructure option handling...
r592 c.append((o[0], o[1], options[o[1]], o[3]))
mpm@selenic.com
catch TERM signal in command processor...
r214
mpm@selenic.com
hg help improvements...
r293 try:
mpm@selenic.com
A bunch of parsing/help updates...
r596 args = fancyopts.fancyopts(args, c, cmdoptions)
mpm@selenic.com
hg help improvements...
r293 except fancyopts.getopt.GetoptError, inst:
mpm@selenic.com
A bunch of parsing/help updates...
r596 raise ParseError(cmd, inst)
mpm@selenic.com
Beginning of new command parsing interface...
r209
mpm@selenic.com
Restructure option handling...
r592 # separate global options back out
mpm@selenic.com
A bunch of parsing/help updates...
r596 for o in globalopts:
mpm@selenic.com
Restructure option handling...
r592 n = o[1]
options[n] = cmdoptions[n]
del cmdoptions[n]
Thomas Arendsen Hein
Moved special handling of --version and no hg command from parse to dispatch....
r1047 return (cmd, cmd and i[0] or None, args, options, cmdoptions)
mpm@selenic.com
A bunch of parsing/help updates...
r596
def dispatch(args):
signal.signal(signal.SIGTERM, catchterm)
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 try:
signal.signal(signal.SIGHUP, catchterm)
except AttributeError:
pass
mpm@selenic.com
A bunch of parsing/help updates...
r596
mason@suse.com
Add support for extension modules...
r1071 u = ui.ui()
external = []
for x in u.extensions():
if x[1]:
mpm@selenic.com
Warn on failure to import an extension
r1342 try:
mod = imp.load_source(x[0], x[1])
except:
u.warn("*** failed to import extension %s\n" % x[1])
continue
mason@suse.com
Add support for extension modules...
r1071 else:
def importh(name):
mod = __import__(name)
components = name.split('.')
for comp in components[1:]:
mod = getattr(mod, comp)
return mod
mpm@selenic.com
Warn on failure to import an extension
r1342 try:
mod = importh(x[0])
except:
u.warn("failed to import extension %s\n" % x[0])
continue
mason@suse.com
Add support for extension modules...
r1071 external.append(mod)
for x in external:
Bryan O'Sullivan
Make contract with extensions optional.
r1295 cmdtable = getattr(x, 'cmdtable', {})
for t in cmdtable:
mason@suse.com
Add support for extension modules...
r1071 if t in table:
Bryan O'Sullivan
Make contract with extensions optional.
r1295 u.warn("module %s overrides %s\n" % (x.__name__, t))
table.update(cmdtable)
mason@suse.com
Add support for extension modules...
r1071
mpm@selenic.com
A bunch of parsing/help updates...
r596 try:
cmd, func, args, options, cmdoptions = parse(args)
except ParseError, inst:
if inst.args[0]:
u.warn("hg %s: %s\n" % (inst.args[0], inst.args[1]))
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 help_(u, inst.args[0])
mpm@selenic.com
A bunch of parsing/help updates...
r596 else:
u.warn("hg: %s\n" % inst.args[1])
Thomas Arendsen Hein
Always show short help when an unknown command is given.
r848 help_(u, 'shortlist')
mpm@selenic.com
A bunch of parsing/help updates...
r596 sys.exit(-1)
except UnknownCommand, inst:
u.warn("hg: unknown command '%s'\n" % inst.args[0])
Thomas Arendsen Hein
Always show short help when an unknown command is given.
r848 help_(u, 'shortlist')
mpm@selenic.com
A bunch of parsing/help updates...
r596 sys.exit(1)
Stephen Darnell
Add a --time command line option to time hg commands
r783 if options["time"]:
def get_times():
t = os.times()
if t[4] == 0.0: # Windows leaves this as zero, so use time.clock()
t = (t[0], t[1], t[2], t[3], time.clock())
return t
s = get_times()
def print_time():
t = get_times()
u.warn("Time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n" %
(t[4]-s[4], t[0]-s[0], t[2]-s[2], t[1]-s[1], t[3]-s[3]))
atexit.register(print_time)
mason@suse.com
Add support for extension modules...
r1071 u.updateopts(options["verbose"], options["debug"], options["quiet"],
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 not options["noninteractive"])
mpm@selenic.com
Restructure option handling...
r592
mpm@selenic.com
Add --debugger global option...
r1225 # enter the debugger before command execution
if options['debugger']:
pdb.set_trace()
mpm@selenic.com
Add exception class for repository errors...
r499 try:
mpm@selenic.com
[PATCH] Add --traceback option...
r527 try:
Thomas Arendsen Hein
Added options -h/--help.
r1048 if options['help']:
Thomas Arendsen Hein
Allow --help and --version being used together.
r1049 help_(u, cmd, options['version'])
Thomas Arendsen Hein
Added options -h/--help.
r1048 sys.exit(0)
elif options['version']:
Thomas Arendsen Hein
Moved special handling of --version and no hg command from parse to dispatch....
r1047 show_version(u)
sys.exit(0)
elif not cmd:
help_(u, 'shortlist')
sys.exit(0)
Thomas Arendsen Hein
Moved --cwd handling to a place where ui and exception handling already exists.
r1050 if options['cwd']:
try:
os.chdir(options['cwd'])
except OSError, inst:
Bryan O'Sullivan
Replace sequences of {ui.warn, return 1} with raise of util.Abort.
r1227 raise util.Abort('%s: %s' %
(options['cwd'], inst.strerror))
Thomas Arendsen Hein
Moved --cwd handling to a place where ui and exception handling already exists.
r1050
mpm@selenic.com
[PATCH] Add --traceback option...
r527 if cmd not in norepo.split():
path = options["repository"] or ""
repo = hg.repository(ui=u, path=path)
mason@suse.com
Add support for extension modules...
r1071 for x in external:
Bryan O'Sullivan
Make contract with extensions optional.
r1295 if hasattr(x, 'reposetup'): x.reposetup(u, repo)
mpm@selenic.com
A bunch of parsing/help updates...
r596 d = lambda: func(u, repo, *args, **cmdoptions)
mpm@selenic.com
[PATCH] Add --traceback option...
r527 else:
mpm@selenic.com
A bunch of parsing/help updates...
r596 d = lambda: func(u, *args, **cmdoptions)
mpm@selenic.com
Beginning of new command parsing interface...
r209
mpm@selenic.com
[PATCH] Add --traceback option...
r527 if options['profile']:
import hotshot, hotshot.stats
prof = hotshot.Profile("hg.prof")
r = prof.runcall(d)
prof.close()
stats = hotshot.stats.load("hg.prof")
stats.strip_dirs()
stats.sort_stats('time', 'calls')
stats.print_stats(40)
return r
else:
return d()
except:
mpm@selenic.com
Add --debugger global option...
r1225 # enter the debugger when we hit an exception
if options['debugger']:
pdb.post_mortem(sys.exc_info()[2])
mpm@selenic.com
[PATCH] Add --traceback option...
r527 if options['traceback']:
traceback.print_exc()
raise
mpm@selenic.com
Add exception class for repository errors...
r499 except hg.RepoError, inst:
u.warn("abort: ", inst, "!\n")
mpm@selenic.com
Smarter handling of revlog key errors...
r1214 except revlog.RevlogError, inst:
u.warn("abort: ", inst, "!\n")
mpm@selenic.com
catch TERM signal in command processor...
r214 except SignalInterrupt:
u.warn("killed!\n")
mpm@selenic.com
Beginning of new command parsing interface...
r209 except KeyboardInterrupt:
Thomas Arendsen Hein
Handle broken pipe on pressing Ctrl-C with e.g. 'hg log|grep something'.
r832 try:
u.warn("interrupted!\n")
except IOError, inst:
if inst.errno == errno.EPIPE:
if u.debugflag:
u.warn("\nbroken pipe\n")
else:
raise
mpm@selenic.com
Catch broken pipes in command interpreter...
r250 except IOError, inst:
mpm@selenic.com
commands: report http exceptions nicely...
r395 if hasattr(inst, "code"):
u.warn("abort: %s\n" % inst)
elif hasattr(inst, "reason"):
mpm@selenic.com
Hide errno in abort messages
r773 u.warn("abort: error: %s\n" % inst.reason[1])
mpm@selenic.com
commands: report http exceptions nicely...
r395 elif hasattr(inst, "args") and inst[0] == errno.EPIPE:
Thomas Arendsen Hein
Cleanups to commands.py
r1065 if u.debugflag:
u.warn("broken pipe\n")
Matt Mackall
Fix pipe error regression
r1350 elif getattr(inst, "strerror", None):
Eric Hopper
Made the abort message for IOError nicer when the filename is known.
r1354 if getattr(inst, "filename", None):
u.warn("abort: %s - %s\n" % (inst.strerror, inst.filename))
else:
u.warn("abort: %s\n" % inst.strerror)
mpm@selenic.com
Catch broken pipes in command interpreter...
r250 else:
raise
mpm@selenic.com
[PATCH] Catch OSError usefully...
r549 except OSError, inst:
if hasattr(inst, "filename"):
u.warn("abort: %s: %s\n" % (inst.strerror, inst.filename))
else:
u.warn("abort: %s\n" % inst.strerror)
Bryan O'Sullivan
Teach walk code about absolute paths....
r870 except util.Abort, inst:
Bryan O'Sullivan
Get commands to raise Abort instead of ui.warn(...),sys.exit(1).
r727 u.warn('abort: ', inst.args[0] % inst.args[1:], '\n')
sys.exit(1)
mpm@selenic.com
commands: better argument processing, per-command help...
r212 except TypeError, inst:
# was this an argument error?
tb = traceback.extract_tb(sys.exc_info()[2])
if len(tb) > 2: # no
raise
mpm@selenic.com
hg help improvements...
r293 u.debug(inst, "\n")
mpm@selenic.com
A bunch of parsing/help updates...
r596 u.warn("%s: invalid arguments\n" % cmd)
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 help_(u, cmd)
Thomas Arendsen Hein
Always show short help when an unknown command is given.
r848 except UnknownCommand, inst:
u.warn("hg: unknown command '%s'\n" % inst.args[0])
help_(u, 'shortlist')
mpm@selenic.com
Add reporting instructions to unknown exception backtraces
r1215 except SystemExit:
mpm@selenic.com
Fix comment typo
r1229 # don't catch this in the catch-all below
mpm@selenic.com
Add reporting instructions to unknown exception backtraces
r1215 raise
except:
u.warn("** unknown exception encountered, details follow\n")
u.warn("** report bug details to mercurial@selenic.com\n")
raise
mpm@selenic.com
hg help improvements...
r293
mpm@selenic.com
Fix troubles with clone and exception handling...
r503 sys.exit(-1)