##// END OF EJS Templates
Add an option to hg serve to serve file using IPv6
Add an option to hg serve to serve file using IPv6

File last commit:

r825:0108c602 default
r825:0108c602 default
Show More
commands.py
1449 lines | 46.7 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
Thomas Arendsen Hein
Use python function instead of external 'cp' command when cloning repos....
r698 demandload(globals(), "os re sys signal shutil")
Bryan O'Sullivan
Demand-load most modules in the commands and ui modules....
r613 demandload(globals(), "fancyopts ui hg util")
Bryan O'Sullivan
Add locate command....
r627 demandload(globals(), "fnmatch hgweb mdiff random signal time traceback")
Stephen Darnell
Add a --time command line option to time hg commands
r783 demandload(globals(), "errno socket version struct atexit")
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
Bryan O'Sullivan
Get commands to raise Abort instead of ui.warn(...),sys.exit(1).
r727 class Abort(Exception):
"""Raised if a command needs to print an error and exit."""
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
big heap of command clean-up work...
r245 def relfilter(repo, files):
Bryan O'Sullivan
Use repo.getcwd() in a few obvious places....
r628 cwd = repo.getcwd()
if cwd:
return filterfiles([util.pconvert(cwd)], files)
mpm@selenic.com
big heap of command clean-up work...
r245 return files
mpm@selenic.com
commands: migrate status and branch...
r213
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:
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 return [util.pconvert(os.path.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
mpm@selenic.com
Refactor matchpats and walk...
r742 def matchpats(cwd, pats = [], opts = {}, head = ''):
Bryan O'Sullivan
Clean up walk and changes code to use normalised names properly....
r820 return util.matcher(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
Bryan O'Sullivan
Clean up walk and changes code to use normalised names properly....
r820 def pathto(n1, n2):
'''return the relative path from one place to another'''
if not n1: return n2
a, b = n1.split(os.sep), n2.split(os.sep)
a.reverse(), b.reverse()
while a and b and a[-1] == b[-1]:
a.pop(), b.pop()
b.reverse()
return os.sep.join((['..'] * len(a)) + b)
mpm@selenic.com
Refactor matchpats and walk...
r742 def walk(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
Reduce the amount of stat traffic generated by a walk....
r812 files, matchfn = matchpats(cwd, pats, opts, head)
for src, fn in repo.walk(files = files, match = matchfn):
Bryan O'Sullivan
Clean up walk and changes code to use normalised names properly....
r820 yield src, fn, pathto(cwd, fn)
Bryan O'Sullivan
Get add and locate to use new repo and dirstate walk code....
r724
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):
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
if num < 0:
num += revcount
mpm@selenic.com
[PATCH] New export patch...
r580 if not (0 <= num < revcount):
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
Get commands to raise Abort instead of ui.warn(...),sys.exit(1).
r727 raise Abort('invalid revision identifier %s', val)
mpm@selenic.com
[PATCH] New export patch...
r580 return num
for spec in revs:
if spec.find(revrangesep) >= 0:
start, end = spec.split(revrangesep, 1)
start = fix(start, 0)
end = fix(end, revcount - 1)
if end > start:
end += 1
step = 1
else:
end -= 1
step = -1
for rev in xrange(start, end, step):
yield str(rev)
else:
yield spec
Bryan O'Sullivan
Split make_file back out into make_filename and make_file....
r739 def make_filename(repo, r, pat, node=None,
total=None, seqno=None, revwidth=None):
thananck@yahoo.com
Provides output option to cat command...
r632 node_expander = {
'H': lambda: hg.hex(node),
'R': lambda: str(r.rev(node)),
'h': lambda: hg.short(node),
}
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)))
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:
raise Abort("invalid format spec '%%%s' in output file name",
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,
total=None, seqno=None, revwidth=None, mode='wb'):
if not pat or pat == '-':
if 'w' in mode: return sys.stdout
else: return sys.stdin
if hasattr(pat, 'write') and 'w' in mode:
return pat
if hasattr(pat, 'read') and 'r' in mode:
return pat
return open(make_filename(repo, r, pat, node, total, seqno, revwidth),
mode)
Thomas Arendsen Hein
Removed extra spaces for default parameters according to PEP8....
r700 def dodiff(fp, ui, repo, files=None, node1=None, node2=None):
mpm@selenic.com
big heap of command clean-up work...
r245 def date(c):
return time.asctime(time.gmtime(float(c[2].split(' ')[0])))
mpm@selenic.com
Fix dodiff/changes...
r561 (c, a, d, u) = repo.changes(node1, node2, files)
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])
date2 = date(change)
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:
date2 = time.asctime()
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:
hexfunc = ui.verbose and hg.hex or hg.short
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])
date1 = date(change)
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
[PATCH] New export patch...
r580 fp.write(mdiff.unidiff(to, date1, tn, date2, f, r))
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
[PATCH] New export patch...
r580 fp.write(mdiff.unidiff(to, date1, tn, date2, f, r))
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
[PATCH] New export patch...
r580 fp.write(mdiff.unidiff(to, date1, tn, date2, f, r))
Thomas Arendsen Hein
Use common output function show_changeset() for hg heads|history|log|tip....
r329
def show_changeset(ui, repo, rev=0, changenode=None, filelog=None):
"""show a single changeset or file revision"""
changelog = repo.changelog
if filelog:
log = filelog
filerev = rev
node = filenode = filelog.node(filerev)
changerev = filelog.linkrev(filenode)
changenode = changenode or changelog.node(changerev)
else:
Thomas Arendsen Hein
Cleaned up show_changeset()...
r347 log = changelog
Thomas Arendsen Hein
Use common output function show_changeset() for hg heads|history|log|tip....
r329 changerev = rev
if changenode is None:
changenode = changelog.node(changerev)
elif not changerev:
rev = changerev = changelog.rev(changenode)
node = changenode
if ui.quiet:
ui.write("%d:%s\n" % (rev, hg.hex(node)))
return
changes = changelog.read(changenode)
mpm@selenic.com
Shorten hashes displayed in log
r778 parents = [(log.rev(p), ui.verbose and hg.hex(p) or hg.short(p))
for p in log.parents(node)
if ui.debugflag or p != hg.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:
ui.write("changeset: %d:%s\n" % (changerev, hg.hex(changenode)))
else:
ui.write("changeset: %d:%s\n" % (changerev, hg.short(changenode)))
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)
Thomas Arendsen Hein
Use common output function show_changeset() for hg heads|history|log|tip....
r329 if filelog:
Matt Mackall
Hide file hashes in log...
r687 ui.debug("file rev: %d:%s\n" % (filerev, hg.hex(filenode)))
mpm@selenic.com
Shorten hashes displayed in log
r778
ui.debug("manifest: %d:%s\n" % (repo.manifest.rev(changes[0]),
Matt Mackall
Hide file hashes in log...
r687 hg.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])
ui.status("date: %s\n" % time.asctime(
time.localtime(float(changes[2].split(' ')[0]))))
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:
mpm@selenic.com
Refactor diffrevs/diffdir into changes...
r536 files = repo.changes(changelog.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"""
ui.write("Mercurial version %s\n" % version.get_version())
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
Multiple cleanups of things detected by pylint....
r697 def help_(ui, cmd=None):
"""show help for a given command or all commands"""
mpm@selenic.com
commands: better argument processing, per-command help...
r212 if cmd:
try:
i = find(cmd)
ui.write("%s\n\n" % i[2])
mpm@selenic.com
hg help improvements...
r293
if i[1]:
for s, l, d, c in i[1]:
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 opt = ' '
if s:
opt = opt + '-' + s + ' '
if l:
opt = opt + '--' + l + ' '
if d:
opt = opt + '(' + str(d) + ')'
mpm@selenic.com
hg help improvements...
r293 ui.write(opt, "\n")
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 if c:
ui.write(' %s\n' % c)
mpm@selenic.com
hg help improvements...
r293 ui.write("\n")
mpm@selenic.com
commands: better argument processing, per-command help...
r212 ui.write(i[0].__doc__, "\n")
except UnknownCommand:
mpm@selenic.com
unknown command fixups...
r268 ui.warn("hg: unknown command %s\n" % cmd)
mpm@selenic.com
commands: better argument processing, per-command help...
r212 sys.exit(0)
mpm@selenic.com
hg help: use docstrings only...
r255 else:
mpm@selenic.com
Shorten help...
r593 if ui.verbose:
mpm@selenic.com
Fix up version module name and command conflict...
r470 show_version(ui)
Thomas Arendsen Hein
Support for 'hg --version'. setup.py stores version from hg repository....
r423 ui.write('\n')
mpm@selenic.com
Shorten help...
r593 if ui.verbose:
ui.write('hg commands:\n\n')
else:
mpm@selenic.com
A bunch of parsing/help updates...
r596 ui.write('basic hg commands (use "hg help -v" for more):\n\n')
mpm@selenic.com
Beginning of new command parsing interface...
r209
mpm@selenic.com
hg help: use docstrings only...
r255 h = {}
Thomas Arendsen Hein
Cleaned up command alias handling in help....
r479 for c, e in table.items():
f = c.split("|")[0]
mpm@selenic.com
Shorten help...
r593 if not ui.verbose and not f.startswith("^"):
Thomas Arendsen Hein
Cleaned up command alias handling in help....
r479 continue
mpm@selenic.com
Shorten help...
r593 if not ui.debugflag and f.startswith("debug"):
continue
f = f.lstrip("^")
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
mpm@selenic.com
hg help: use docstrings only...
r255
fns = h.keys()
fns.sort()
m = max(map(len, fns))
for f in fns:
Thomas Arendsen Hein
Support for 'hg --version'. setup.py stores version from hg repository....
r423 ui.write(' %-*s %s\n' % (m, f, h[f]))
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 = []
q = dict(zip(pats, pats))
Bryan O'Sullivan
Add a source designator to the walk methods....
r726 for src, abs, rel in walk(repo, pats, opts):
Bryan O'Sullivan
Get add and locate to use new repo and dirstate walk code....
r724 if rel in q or abs in q:
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
Get addremove to use new walk code....
r766 q = dict(zip(pats, pats))
Bryan O'Sullivan
Fix performance regression in addremove command....
r809 add, remove = [], []
for src, abs, rel in walk(repo, pats, opts):
if src == 'f':
if repo.dirstate.state(abs) == '?':
add.append(abs)
if rel not in q: ui.status('adding ', rel, '\n')
elif repo.dirstate.state(abs) != 'r' and not os.path.exists(rel):
remove.append(abs)
if rel not in q: ui.status('removing ', rel, '\n')
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):
return hg.short(repo.changelog.node(rev))
def getname(rev):
try:
return bcache[rev]
except KeyError:
cl = repo.changelog.read(repo.changelog.node(rev))
name = cl[1]
f = name.find('@')
if f >= 0:
name = name[:f]
mpm@selenic.com
[PATCH] Handle 'name firstname <email@server>' correctly in annotate...
r534 f = name.find('<')
if f >= 0:
name = name[f+1:]
mpm@selenic.com
Beginning of new command parsing interface...
r209 bcache[rev] = name
return name
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:
raise Abort('at least one file name or pattern required')
mpm@selenic.com
Beginning of new command parsing interface...
r209 bcache = {}
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
Handle empty file list for annotate
r744 for src, abs, rel 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
Bryan O'Sullivan
Convert annotate over to walk interface....
r733 lines = repo.file(abs).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
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 def cat(ui, repo, file1, rev=None, **opts):
mpm@selenic.com
hg help: use docstrings only...
r255 """output the latest or given revision of a file"""
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 r = repo.file(relpath(repo, [file1])[0])
if rev:
n = r.lookup(rev)
else:
n = r.tip()
Bryan O'Sullivan
Turn make_filename into make_file, which returns a file handle.
r729 fp = make_file(repo, r, opts['output'], node=n)
thananck@yahoo.com
Provides output option to cat command...
r632 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):
ui.warn("abort: destination '%s' already exists\n" % dest)
return 1
mpm@selenic.com
[PATCH] Force "hg clone" to always create a new directory...
r523
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
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 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 source = ui.expandpath(source)
other = hg.repository(ui, source)
mpm@selenic.com
[PATCH] add clone command...
r485
Mikael Berthe
hg clone stored path fix...
r675 if other.dev() != -1:
abspath = os.path.abspath(source)
Thomas Arendsen Hein
Use python function instead of external 'cp' command when cloning repos....
r698 copyfile = (os.stat(dest).st_dev == other.dev()
and getattr(os, 'link', None) or shutil.copy2)
if copyfile is not shutil.copy2:
ui.note("cloning by hardlink\n")
util.copytree(os.path.join(source, ".hg"), os.path.join(dest, ".hg"),
copyfile)
mpm@selenic.com
Deal with failed clone/transaction interaction...
r535 try:
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 os.unlink(os.path.join(dest, ".hg", "dirstate"))
mpm@selenic.com
Fix bug in exception handling for hardlink clone
r770 except OSError:
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 pass
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
mpm@selenic.com
Deal with failed clone/transaction interaction...
r535 f = repo.opener("hgrc", "w")
f.write("[paths]\n")
mpm@selenic.com
hg clone: only use the absolute path for .hg/hgrc...
r562 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']
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:
Thomas Arendsen Hein
Changed more occurances of 'text' to 'message'.
r762 message = open(logfile).read()
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 except IOError, why:
Thomas Arendsen Hein
Changed more occurances of 'text' to 'message'.
r762 ui.warn("Can't read commit message %s: %s\n" % (logfile, why))
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']]
fns, match = matchpats((pats and repo.getcwd()) or '', pats, opts)
if pats:
c, a, d, u = repo.changes(files = fns, match = match)
files = c + a + [fn for fn in d if repo.dirstate.state(fn) == 'r']
else:
files = []
repo.commit(files, message, opts['user'], opts['date'], match)
mpm@selenic.com
big heap of command clean-up work...
r245
mpm@selenic.com
Add hg copy...
r363 def copy(ui, repo, source, dest):
"""mark a file as copied or renamed for the next commit"""
return repo.copy(*relpath(repo, (source, dest)))
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
Get commands to raise Abort instead of ui.warn(...),sys.exit(1).
r727 raise Abort(".hg/dirstate inconsistent with current parent's manifest")
mpm@selenic.com
add dirstate debugging commands...
r460
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 dirstate debugging commands...
r460
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"""
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 r = hg.revlog(hg.opener(""), file_, "")
mpm@selenic.com
Remove all remaining print statements...
r582 ui.write(" rev offset length base linkrev" +
" p1 p2 nodeid\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("% 6d % 9d % 7d % 6d % 7d %s.. %s.. %s..\n" % (
i, e[0], e[1], e[2], e[3],
hg.hex(e[4][:5]), hg.hex(e[5][:5]), hg.hex(e[6][: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"""
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 r = hg.revlog(hg.opener(""), 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
migrate remaining commands...
r248 if e[5] != hg.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
Bryan O'Sullivan
Clean up walk and changes code to use normalised names properly....
r820 def debugwalk(ui, repo, *pats, **opts):
items = list(walk(repo, pats, opts))
fmt = '%%s %%-%ds %%s' % max([len(abs) for (src, abs, rel) in items])
for i in items: print fmt % i
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
big heap of command clean-up work...
r245 revs = []
if opts['rev']:
revs = map(lambda x: repo.lookup(x), opts['rev'])
Thomas Arendsen Hein
Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli....
r396
mpm@selenic.com
big heap of command clean-up work...
r245 if len(revs) > 2:
Bryan O'Sullivan
Get commands to raise Abort instead of ui.warn(...),sys.exit(1).
r727 raise Abort("too many revisions to diff")
mpm@selenic.com
big heap of command clean-up work...
r245
Bryan O'Sullivan
Convert diff command over to using walk code.
r732 files = []
for src, abs, rel in walk(repo, pats, opts):
files.append(abs)
mpm@selenic.com
[PATCH] New export patch...
r580 dodiff(sys.stdout, ui, repo, files, *revs)
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])
fp.write("# Node ID %s\n" % hg.hex(node))
fp.write("# Parent %s\n" % hg.hex(prev))
mpm@selenic.com
Migrate rawcommit, import, export, history, and merge...
r246 if other != hg.nullid:
mpm@selenic.com
Remove all remaining print statements...
r582 fp.write("# Parent %s\n" % hg.hex(other))
fp.write(change[4].rstrip())
fp.write("\n\n")
mpm@selenic.com
[PATCH] New export patch...
r580
dodiff(fp, ui, repo, None, prev, node)
Bryan O'Sullivan
Split make_file back out into make_filename and make_file....
r739 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
Get commands to raise Abort instead of ui.warn(...),sys.exit(1).
r727 raise 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)
revwidth = max(len(revs[0]), len(revs[-1]))
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 q = dict(zip(pats, pats))
forget = []
for src, abs, rel in walk(repo, pats, opts):
if repo.dirstate.state(abs) == 'a':
forget.append(abs)
if rel not in q: ui.status('forgetting ', rel, '\n')
repo.forget(forget)
mpm@selenic.com
big heap of command clean-up work...
r245
mpm@selenic.com
Beginning of multi-head support...
r221 def heads(ui, repo):
Thomas Arendsen Hein
Use common output function show_changeset() for hg heads|history|log|tip....
r329 """show current repository heads"""
mpm@selenic.com
Beginning of multi-head support...
r221 for n in repo.changelog.heads():
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
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
rework all code using tags...
r343 parents = [p for p in repo.dirstate.parents() if p != hg.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
Thomas Arendsen Hein
Improvements for hg identify:...
r386 hexfunc = ui.verbose and hg.hex or hg.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
Commands cleanup...
r437 d = opts["base"]
strip = opts["strip"]
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()
if line.startswith("--- ") or line.startswith("diff -r"):
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
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
f = os.popen("patch -p%d < %s" % (strip, pf))
files = []
for l in f.read().splitlines():
l.rstrip('\r\n');
Thomas Arendsen Hein
hg import checking for quiet mode didn't work. Fixed using the ui module....
r481 ui.status("%s\n" % l)
chad.netzer@gmail.com
Make consistent use of str.startswith() in conditionals....
r674 if l.startswith('patching file '):
mpm@selenic.com
hg import error checking...
r443 pf = l[14:]
if pf not in files:
files.append(pf)
patcherr = f.close()
if patcherr:
Bryan O'Sullivan
Get commands to raise Abort instead of ui.warn(...),sys.exit(1).
r727 raise Abort("patch failed")
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
mpm@selenic.com
[PATCH] simplify init...
r496 def init(ui, source=None):
"""create a new repository in the current directory"""
mpm@selenic.com
replace hg branch with hg init [source]...
r290
if source:
Bryan O'Sullivan
Get commands to raise Abort instead of ui.warn(...),sys.exit(1).
r727 raise Abort("no longer supported: use \"hg clone\" instead")
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 hg.repository(ui, ".", 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"""
mpm@selenic.com
Refactor matchpats and walk...
r742 end = '\n'
Bryan O'Sullivan
Get add and locate to use new repo and dirstate walk code....
r724 if opts['print0']: end = '\0'
mpm@selenic.com
Refactor matchpats and walk...
r742
for src, abs, rel in walk(repo, pats, opts, '(?:.*/|)'):
Bryan O'Sullivan
Get add and locate to use new repo and dirstate walk code....
r724 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
Thomas Arendsen Hein
Allow specifying revisions in 'hg log' like with 'hg diff'....
r552 def log(ui, repo, f=None, **opts):
mpm@selenic.com
[PATCH] replace history with log...
r509 """show the revision history of the repository or a single file"""
if f:
Alecs King
On Sat, Jul 02, 2005 at 02:11:34PM -0700, Matt Mackall wrote:...
r612 files = relpath(repo, [f])
filelog = repo.file(files[0])
Thomas Arendsen Hein
Allow specifying revisions in 'hg log' like with 'hg diff'....
r552 log = filelog
lookup = filelog.lookup
mpm@selenic.com
[PATCH] replace history with log...
r509 else:
Alecs King
On Sat, Jul 02, 2005 at 02:11:34PM -0700, Matt Mackall wrote:...
r612 files = None
Thomas Arendsen Hein
Allow specifying revisions in 'hg log' like with 'hg diff'....
r552 filelog = None
log = repo.changelog
lookup = repo.lookup
revlist = []
revs = [log.rev(lookup(rev)) for rev in opts['rev']]
while revs:
if len(revs) == 1:
revlist.append(revs.pop(0))
else:
a = revs.pop(0)
b = revs.pop(0)
off = a > b and -1 or 1
revlist.extend(range(a, b + off, off))
Matt Mackall
[PATCH] hg tag: local tag support in file .hg/localtags...
r609
Thomas Arendsen Hein
Allow specifying revisions in 'hg log' like with 'hg diff'....
r552 for i in revlist or range(log.count() - 1, -1, -1):
show_changeset(ui, repo, filelog=filelog, rev=i)
Alecs King
On Sat, Jul 02, 2005 at 02:11:34PM -0700, Matt Mackall wrote:...
r612 if opts['patch']:
if filelog:
filenode = filelog.node(i)
i = filelog.linkrev(filenode)
changenode = repo.changelog.node(i)
prev, other = repo.changelog.parents(changenode)
dodiff(sys.stdout, ui, repo, files, prev, changenode)
Thomas Arendsen Hein
Removed extra newline in hg log when not using the --patch option, fixed tests....
r696 ui.write("\n\n")
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
add tracking of execute permissions...
r276 ui.write("%40s %3s %s\n" % (hg.hex(m[f]), mf[f] and "755" or "644", f))
mpm@selenic.com
hg help: use docstrings only...
r255
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:
if n != hg.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
TK Soh
Add paths command...
r779 def paths(ui, repo, search = None):
"""show path or list of available paths"""
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
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
Actually implement the -f switch for push
r818 def push(ui, repo, dest="default-push", force=False):
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
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']:
ui.warn("abort: missing commit message\n")
mpm@selenic.com
Migrate rawcommit, import, export, history, and merge...
r246 return 1
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
Thomas Arendsen Hein
Changed more occurances of 'text' to 'message'.
r762 repo.rawcommit(files, message, rc['user'], rc['date'], *rc['parent'])
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()
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 def remove(ui, repo, file1, *files):
mpm@selenic.com
big heap of command clean-up work...
r245 """remove the specified files on the next commit"""
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 repo.remove(relpath(repo, (file1,) + files))
mpm@selenic.com
big heap of command clean-up work...
r245
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()
respond(" ".join(map(hg.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()
nodes = map(hg.bin, nodes.split(" "))
r = []
for b in repo.branches(nodes):
r.append(" ".join(map(hg.hex, b)) + "\n")
respond("".join(r))
elif cmd == "between":
arg, pairs = getarg()
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 pairs = [map(hg.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):
r.append(" ".join(map(hg.hex, b)) + "\n")
respond("".join(r))
elif cmd == "changegroup":
nodes = []
arg, roots = getarg()
nodes = map(hg.bin, roots.split(" "))
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
[PATCH] Get "hg serve" to optionally log accesses and errors to files...
r605 def openlog(opt, default):
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 if opts[opt] and opts[opt] != '-':
return open(opts[opt], 'w')
else:
return default
Matt Mackall
Add an sshrepository class and hg serve --stdio
r624
mpm@selenic.com
[PATCH] Get "hg serve" to print the URL being served...
r603 httpd = hgweb.create_server(repo.root, opts["name"], opts["templates"],
Samuel Tardieu
Add an option to hg serve to serve file using IPv6
r825 opts["address"], opts["port"], opts["ipv6"],
mpm@selenic.com
[PATCH] Get "hg serve" to optionally log accesses and errors to files...
r605 openlog('accesslog', sys.stdout),
openlog('errorlog', sys.stderr))
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
? = 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()
files, matchfn = matchpats(cwd, pats, opts)
Thomas Arendsen Hein
Use list comprehension in hg status.
r823 (c, a, d, u) = [[pathto(cwd, x) for x in n]
for n in repo.changes(files=files, match=matchfn)]
mpm@selenic.com
commands: migrate status and branch...
r213
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 for f in c:
mpm@selenic.com
Change C to M in status
r746 ui.write("M ", f, "\n")
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 for f in a:
ui.write("A ", f, "\n")
for f in d:
ui.write("R ", f, "\n")
for f in u:
ui.write("? ", f, "\n")
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":
mpm@selenic.com
[PATCH] New export patch...
r580 ui.warn("abort: 'tip' is a reserved name!\n")
return -1
Matt Mackall
[PATCH] hg tag: local tag support in file .hg/localtags...
r609 if rev:
r = hg.hex(repo.lookup(rev))
else:
r = hg.hex(repo.changelog.tip())
mpm@selenic.com
[PATCH] New export patch...
r580 if name.find(revrangesep) >= 0:
ui.warn("abort: '%s' cannot be used in a tag name\n" % revrangesep)
return -1
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:
ui.warn("abort: working copy of .hgtags is changed!\n")
mpm@selenic.com
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>...
r401 ui.status("(please commit .hgtags manually)\n")
mpm@selenic.com
[PATCH] New export patch...
r580 return -1
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))
repo.commit([".hgtags"], message, opts['user'], opts['date'])
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:
Thomas Arendsen Hein
Handle errors in .hgtags or hgrc [tags] section more gracefully....
r477 r = "%5d:%s" % (repo.changelog.rev(n), hg.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
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()
mpm@selenic.com
various merge improvements...
r275 def update(ui, repo, node=None, merge=False, clean=False):
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.
'''
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 = {
Bryan O'Sullivan
Get add and locate to use new repo and dirstate walk code....
r724 "^add": (add,
[('I', 'include', [], 'include path in search'),
('X', 'exclude', [], 'exclude path from search')],
Thomas Arendsen Hein
Updated help strings and test-help:...
r757 "hg add [FILE]..."),
Bryan O'Sullivan
Get addremove to use new walk code....
r766 "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'),
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')],
Thomas Arendsen Hein
Changed command synopsises to match style of common UNIX tools....
r707 'hg annotate [-r REV] [-u] [-n] [-c] FILE...'),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 "cat":
(cat,
[('o', 'output', "", 'output to file')],
Thomas Arendsen Hein
Changed command synopsises to match style of common UNIX tools....
r707 'hg cat [-o OUTFILE] FILE [REV]'),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 "^clone":
(clone,
[('U', 'noupdate', None, 'skip update after cloning')],
Thomas Arendsen Hein
Changed command synopsises to match style of common UNIX tools....
r707 'hg clone [-U] 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]...'),
"copy": (copy, [], 'hg copy SOURCE DEST'),
mpm@selenic.com
A bunch of parsing/help updates...
r596 "debugcheckstate": (debugcheckstate, [], 'debugcheckstate'),
"debugstate": (debugstate, [], 'debugstate'),
Thomas Arendsen Hein
Changed command synopsises to match style of common UNIX tools....
r707 "debugindex": (debugindex, [], 'debugindex FILE'),
"debugindexdot": (debugindexdot, [], 'debugindexdot FILE'),
Bryan O'Sullivan
Clean up walk and changes code to use normalised names properly....
r820 "debugwalk": (debugwalk,
[('I', 'include', [], 'include path in search'),
('X', 'exclude', [], 'exclude path from search')],
'debugwalk [OPTIONS]... [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'),
('I', 'include', [], 'include path in search'),
('X', 'exclude', [], 'exclude path from search')],
Thomas Arendsen Hein
Changed command synopsises to match style of common UNIX tools....
r707 'hg diff [-r REV1 [-r REV2]] [FILE]...'),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 "^export":
(export,
[('o', 'output', "", 'output to file')],
Thomas Arendsen Hein
Changed command synopsises to match style of common UNIX tools....
r707 "hg export [-o OUTFILE] REV..."),
Bryan O'Sullivan
Move commands.forget over to using new walk code....
r810 "forget": (forget,
[('I', 'include', [], 'include path in search'),
('X', 'exclude', [], 'exclude path from search')],
"hg forget FILE..."),
mpm@selenic.com
big heap of command clean-up work...
r245 "heads": (heads, [], 'hg heads'),
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'),
('b', 'base', "", 'base path')],
Thomas Arendsen Hein
Changed command synopsises to match style of common UNIX tools....
r707 "hg import [-p NUM] [-b BASE] PATCH..."),
mpm@selenic.com
Shorten help...
r593 "^init": (init, [], 'hg init'),
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'),
('0', 'print0', None, 'end records 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')],
Thomas Arendsen Hein
Updated help strings and test-help:...
r757 'hg locate [-r REV] [-f] [-0] [PATTERN]...'),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 "^log|history":
(log,
[('r', 'rev', [], 'revision'),
('p', 'patch', None, 'show patch')],
Thomas Arendsen Hein
Changed command synopsises to match style of common UNIX tools....
r707 'hg log [-r REV1 [-r REV2]] [-p] [FILE]'),
"manifest": (manifest, [], 'hg manifest [REV]'),
"parents": (parents, [], 'hg parents [REV]'),
TK Soh
Add paths command...
r779 "paths": (paths, [], 'hg paths [name]'),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 "^pull":
(pull,
[('u', 'update', None, 'update working directory')],
Thomas Arendsen Hein
Changed command synopsises to match style of common UNIX tools....
r707 'hg pull [-u] [SOURCE]'),
mpm@selenic.com
Actually implement the -f switch for push
r818 "^push":
(push,
[('f', 'force', None, 'force push')],
'hg push [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"),
Thomas Arendsen Hein
Changed command synopsises to match style of common UNIX tools....
r707 "^remove|rm": (remove, [], "hg remove FILE..."),
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'),
('p', 'port', 8000, 'listen port'),
('a', 'address', '', 'interface address'),
('n', 'name', os.getcwd(), 'repository name'),
('', 'stdio', None, 'for remote clients'),
Samuel Tardieu
Add an option to hg serve to serve file using IPv6
r825 ('t', 'templates', "", 'template map'),
('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]..."),
Bryan O'Sullivan
Add name matching to status command.
r731 "^status": (status,
[('I', 'include', [], 'include path in search'),
('X', 'exclude', [], 'exclude path from search')],
Thomas Arendsen Hein
Updated help strings and test-help:...
r757 'hg status [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
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,
[('m', 'merge', None, 'allow merging of conflicts'),
('C', 'clean', None, 'overwrite locally modified files')],
Thomas Arendsen Hein
Changed command synopsises to match style of common UNIX tools....
r707 'hg update [-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'),
mpm@selenic.com
Beginning of new command parsing interface...
r209 }
mpm@selenic.com
A bunch of parsing/help updates...
r596 globalopts = [('v', 'verbose', None, 'verbose'),
('', 'debug', None, 'debug'),
('q', 'quiet', None, 'quiet'),
('', 'profile', None, 'profile'),
('R', 'repository', "", 'repository root directory'),
('', 'traceback', None, 'print traceback on exception'),
('y', 'noninteractive', None, 'run non-interactively'),
('', 'version', None, 'output version information and exit'),
Stephen Darnell
Add a --time command line option to time hg commands
r783 ('', 'time', None, 'time how long the command takes'),
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 ]
mpm@selenic.com
A bunch of parsing/help updates...
r596
mpm@selenic.com
[PATCH] add clone command...
r485 norepo = "clone init version help debugindex debugindexdot"
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):
mpm@selenic.com
commands: better argument processing, per-command help...
r212 return table[e]
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
mpm@selenic.com
A bunch of parsing/help updates...
r596 if options["version"]:
return ("version", show_version, [], options, cmdoptions)
elif not args:
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 return ("help", help_, [], options, cmdoptions)
mpm@selenic.com
Beginning of new command parsing interface...
r209 else:
cmd, args = args[0], args[1:]
mpm@selenic.com
A bunch of parsing/help updates...
r596 i = find(cmd)
mpm@selenic.com
Beginning of new command parsing interface...
r209
mpm@selenic.com
Restructure option handling...
r592 # combine global options into local
c = list(i[1])
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]
mpm@selenic.com
A bunch of parsing/help updates...
r596 return (cmd, i[0], args, options, cmdoptions)
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
try:
cmd, func, args, options, cmdoptions = parse(args)
except ParseError, inst:
u = ui.ui()
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
Multiple cleanups of things detected by pylint....
r697 help_(u)
mpm@selenic.com
A bunch of parsing/help updates...
r596 sys.exit(-1)
except UnknownCommand, inst:
u = ui.ui()
u.warn("hg: unknown command '%s'\n" % inst.args[0])
Thomas Arendsen Hein
Multiple cleanups of things detected by pylint....
r697 help_(u)
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 = ui.ui()
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)
mpm@selenic.com
A bunch of parsing/help updates...
r596 u = ui.ui(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 exception class for repository errors...
r499 try:
mpm@selenic.com
[PATCH] Add --traceback option...
r527 try:
if cmd not in norepo.split():
path = options["repository"] or ""
repo = hg.repository(ui=u, path=path)
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:
if options['traceback']:
traceback.print_exc()
raise
mpm@selenic.com
[PATCH] Harden os.system...
r508 except util.CommandError, inst:
u.warn("abort: %s\n" % inst.args)
mpm@selenic.com
Add exception class for repository errors...
r499 except hg.RepoError, 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:
u.warn("interrupted!\n")
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:
mpm@selenic.com
Be quiet about broken pipes...
r693 if u.debugflag: u.warn("broken pipe\n")
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
Get commands to raise Abort instead of ui.warn(...),sys.exit(1).
r727 except Abort, inst:
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)
mpm@selenic.com
hg help improvements...
r293
mpm@selenic.com
Fix troubles with clone and exception handling...
r503 sys.exit(-1)