Mercurial > public > mercurial-scm > hg-stable
diff mercurial/commands.py @ 1920:b7cc0f323a4c
merge with crew.
author | Vadim Gelfer <vadim.gelfer@gmail.com> |
---|---|
date | Sun, 12 Mar 2006 16:21:59 -0800 |
parents | 7f578969f3f6 4c53aaf2d153 |
children | 3f6be77eda58 7ae177a70f54 |
line wrap: on
line diff
--- a/mercurial/commands.py Sun Mar 12 15:58:56 2006 -0800 +++ b/mercurial/commands.py Sun Mar 12 16:21:59 2006 -0800 @@ -276,6 +276,14 @@ def dodiff(fp, ui, repo, node1, node2, files=None, match=util.always, changes=None, text=False, opts={}): + if not node1: + node1 = repo.dirstate.parents()[0] + # reading the data for node1 early allows it to play nicely + # with repo.changes and the revlog cache. + change = repo.changelog.read(node1) + mmap = repo.manifest.read(change[0]) + date1 = util.datestr(change[2]) + if not changes: changes = repo.changes(node1, node2, files, match=match) modified, added, removed, deleted, unknown = changes @@ -294,8 +302,6 @@ return repo.file(f).read(mmap2[f]) else: date2 = util.datestr() - if not node1: - node1 = repo.dirstate.parents()[0] def read(f): return repo.wread(f) @@ -305,10 +311,6 @@ hexfunc = ui.verbose and hex or short r = [hexfunc(node) for node in [node1, node2] if node] - change = repo.changelog.read(node1) - mmap = repo.manifest.read(change[0]) - date1 = util.datestr(change[2]) - diffopts = ui.diffopts() showfunc = opts.get('show_function') or diffopts['showfunc'] ignorews = opts.get('ignore_all_space') or diffopts['ignorews'] @@ -793,12 +795,7 @@ change = repo.changelog.read(node) mmap = repo.manifest.read(change[0]) - for src, abs, rel, exact in walk(repo, pats, opts): - if abs not in mmap: - ui.warn(_("warning: %s is not in the repository!\n") % - ((pats and rel) or abs)) - continue - + for src, abs, rel, exact in walk(repo, pats, opts, node=node): f = repo.file(abs) if not opts['text'] and util.binary(f.read(mmap[abs])): ui.write(_("%s: binary file\n") % ((pats and rel) or abs)) @@ -834,7 +831,7 @@ contents including permissions, rename data, and revision history. """ f = open(fname, "wb") - dest = ui.expandpath(dest, repo.root) + dest = ui.expandpath(dest) other = hg.repository(ui, dest) o = repo.findoutgoing(other) cg = repo.changegroup(o, 'bundle') @@ -896,6 +893,8 @@ such as AFS, implement hardlinking incorrectly, but do not report errors. In these cases, use the --pull option to avoid hardlinking. + + See pull for valid source format details. """ if dest is None: dest = os.path.basename(os.path.normpath(source)) @@ -921,8 +920,7 @@ if opts['remotecmd']: ui.setconfig("ui", "remotecmd", opts['remotecmd']) - if not os.path.exists(source): - source = ui.expandpath(source) + source = ui.expandpath(source) d = Dircleanup(dest) abspath = source @@ -978,7 +976,7 @@ f.close() if not opts['noupdate']: - update(ui, repo) + update(repo.ui, repo) d.close() @@ -1023,7 +1021,8 @@ except ValueError, inst: raise util.Abort(str(inst)) -def docopy(ui, repo, pats, opts): +def docopy(ui, repo, pats, opts, wlock): + # called with the repo lock held cwd = repo.getcwd() errors = 0 copied = [] @@ -1069,8 +1068,16 @@ if not os.path.isdir(targetdir): os.makedirs(targetdir) try: - shutil.copyfile(relsrc, reltarget) - shutil.copymode(relsrc, reltarget) + restore = repo.dirstate.state(abstarget) == 'r' + if restore: + repo.undelete([abstarget], wlock) + try: + shutil.copyfile(relsrc, reltarget) + shutil.copymode(relsrc, reltarget) + restore = False + finally: + if restore: + repo.remove([abstarget], wlock) except shutil.Error, inst: raise util.Abort(str(inst)) except IOError, inst: @@ -1084,7 +1091,8 @@ if ui.verbose or not exact: ui.status(_('copying %s to %s\n') % (relsrc, reltarget)) targets[abstarget] = abssrc - repo.copy(origsrc, abstarget) + if abstarget != origsrc: + repo.copy(origsrc, abstarget, wlock) copied.append((abssrc, relsrc, exact)) def targetpathfn(pat, dest, srcs): @@ -1192,15 +1200,26 @@ should properly record copied files, this information is not yet fully used by merge, nor fully reported by log. """ - errs, copied = docopy(ui, repo, pats, opts) + try: + wlock = repo.wlock(0) + errs, copied = docopy(ui, repo, pats, opts, wlock) + except lock.LockHeld, inst: + ui.warn(_("repository lock held by %s\n") % inst.args[0]) + errs = 1 return errs def debugancestor(ui, index, rev1, rev2): """find the ancestor revision of two revisions in a given index""" - r = revlog.revlog(util.opener(os.getcwd()), index, "") + r = revlog.revlog(util.opener(os.getcwd(), audit=False), index, "") a = r.ancestor(r.lookup(rev1), r.lookup(rev2)) ui.write("%d:%s\n" % (r.rev(a), hex(a))) +def debugcomplete(ui, cmd): + """returns the completion list associated with the given command""" + clist = findpossible(cmd).keys() + clist.sort() + ui.write("%s\n" % " ".join(clist)) + def debugrebuildstate(ui, repo, rev=None): """rebuild the dirstate as it would look like for the given revision""" if not rev: @@ -1246,12 +1265,8 @@ error = _(".hg/dirstate inconsistent with current parent's manifest") raise util.Abort(error) -def debugconfig(ui): +def debugconfig(ui, repo): """show combined config settings from all hgrc files""" - try: - repo = hg.repository(ui) - except hg.RepoError: - pass for section, name, value in ui.walkconfig(): ui.write('%s.%s=%s\n' % (section, name, value)) @@ -1283,7 +1298,8 @@ def debugdata(ui, file_, rev): """dump the contents of an data file revision""" - r = revlog.revlog(util.opener(os.getcwd()), file_[:-2] + ".i", file_) + r = revlog.revlog(util.opener(os.getcwd(), audit=False), + file_[:-2] + ".i", file_) try: ui.write(r.revision(r.lookup(rev))) except KeyError: @@ -1291,7 +1307,7 @@ def debugindex(ui, file_): """dump the contents of an index file""" - r = revlog.revlog(util.opener(os.getcwd()), file_, "") + r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_, "") ui.write(" rev offset length base linkrev" + " nodeid p1 p2\n") for i in range(r.count()): @@ -1302,7 +1318,7 @@ def debugindexdot(ui, file_): """dump an index DAG as a .dot file""" - r = revlog.revlog(util.opener(os.getcwd()), file_, "") + r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_, "") ui.write("digraph G {\n") for i in range(r.count()): e = r.index[i] @@ -1730,7 +1746,7 @@ Currently only local repositories are supported. """ - source = ui.expandpath(source, repo.root) + source = ui.expandpath(source) other = hg.repository(ui, source) if not other.local(): raise util.Abort(_("incoming doesn't work for remote repositories yet")) @@ -1917,8 +1933,10 @@ Show changesets not found in the specified destination repo or the default push repo. These are the changesets that would be pushed if a push was requested. + + See pull for valid source format details. """ - dest = ui.expandpath(dest, repo.root) + dest = ui.expandpath(dest) other = hg.repository(ui, dest) o = repo.findoutgoing(other) o = repo.changelog.nodesbetween(o)[0] @@ -1953,7 +1971,7 @@ if n != nullid: displayer.show(changenode=n, brinfo=br) -def paths(ui, search=None): +def paths(ui, repo, search=None): """show definition of symbolic path names Show definition of symbolic path name NAME. If no name is given, show @@ -1962,11 +1980,6 @@ Path names are defined in the [paths] section of /etc/mercurial/hgrc and $HOME/.hgrc. If run inside a repository, .hg/hgrc is used, too. """ - try: - repo = hg.repository(ui=ui) - except hg.RepoError: - pass - if search: for name, path in ui.configitems("paths"): if name == search: @@ -1999,7 +2012,7 @@ to the remote user's home directory by default; use two slashes at the start of a path to specify it as relative to the filesystem root. """ - source = ui.expandpath(source, repo.root) + source = ui.expandpath(source) ui.status(_('pulling from %s\n') % (source)) if opts['ssh']: @@ -2044,7 +2057,7 @@ SSH requires an accessible shell account on the destination machine and a copy of hg in the remote path. """ - dest = ui.expandpath(dest, repo.root) + dest = ui.expandpath(dest) ui.status('pushing to %s\n' % (dest)) if opts['ssh']: @@ -2062,6 +2075,7 @@ def rawcommit(ui, repo, *flist, **rc): """raw commit interface (DEPRECATED) + (DEPRECATED) Lowlevel commit, for use in helper scripts. This command is not intended to be used by normal users, as it is @@ -2119,7 +2133,7 @@ def okaytoremove(abs, rel, exact): modified, added, removed, deleted, unknown = repo.changes(files=[abs]) reason = None - if modified: + if modified and not opts['force']: reason = _('is modified') elif added: reason = _('has been marked for add') @@ -2154,21 +2168,33 @@ should properly record rename files, this information is not yet fully used by merge, nor fully reported by log. """ - 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) - names.append(abs) - repo.remove(names, unlink=True) + try: + wlock = repo.wlock(0) + errs, copied = docopy(ui, repo, pats, opts, wlock) + names = [] + for abs, rel, exact in copied: + if ui.verbose or not exact: + ui.status(_('removing %s\n') % rel) + names.append(abs) + repo.remove(names, True, wlock) + except lock.LockHeld, inst: + ui.warn(_("repository lock held by %s\n") % inst.args[0]) + errs = 1 return errs def revert(ui, repo, *pats, **opts): """revert modified files or dirs back to their unmodified states - Revert any uncommitted modifications made to the named files or - directories. This restores the contents of the affected files to - an unmodified state. + In its default mode, it reverts any uncommitted modifications made + to the named files or directories. This restores the contents of + the affected files to an unmodified state. + + Using the -r option, it reverts the given files or directories to + their state as of an earlier revision. This can be helpful to "roll + back" some or all of a change that should not have been committed. + + Revert modifies the working directory. It does not commit any + changes, or change the parent of the current working directory. If a file has been deleted, it is recreated. If the executable mode of a file was changed, it is reset. @@ -2183,7 +2209,7 @@ files, choose, anypats = matchpats(repo, pats, opts) modified, added, removed, deleted, unknown = repo.changes(match=choose) repo.forget(added) - repo.undelete(removed + deleted) + repo.undelete(removed) return repo.update(node, False, True, choose, False) @@ -2573,50 +2599,51 @@ ('c', 'changeset', None, _('list the changeset')), ('I', 'include', [], _('include names matching the given patterns')), ('X', 'exclude', [], _('exclude names matching the given patterns'))], - _('hg annotate [OPTION]... FILE...')), + _('hg annotate [-r REV] [-a] [-u] [-d] [-n] [-c] FILE...')), "bundle": (bundle, [], _('hg bundle FILE DEST')), "cat": (cat, - [('I', 'include', [], _('include names matching the given patterns')), - ('X', 'exclude', [], _('exclude names matching the given patterns')), - ('o', 'output', '', _('print output to file with formatted name')), - ('r', 'rev', '', _('print the given revision'))], + [('o', 'output', '', _('print output to file with formatted name')), + ('r', 'rev', '', _('print the given revision')), + ('I', 'include', [], _('include names matching the given patterns')), + ('X', 'exclude', [], _('exclude names matching the given patterns'))], _('hg cat [OPTION]... FILE...')), "^clone": (clone, [('U', 'noupdate', None, _('do not update the new working directory')), - ('e', 'ssh', '', _('specify ssh command to use')), - ('', 'pull', None, _('use pull protocol to copy metadata')), ('r', 'rev', [], _('a changeset you would like to have after cloning')), + ('', 'pull', None, _('use pull protocol to copy metadata')), + ('e', 'ssh', '', _('specify ssh command to use')), ('', 'remotecmd', '', _('specify hg command to run on the remote side'))], _('hg clone [OPTION]... SOURCE [DEST]')), "^commit|ci": (commit, [('A', 'addremove', None, _('run addremove during commit')), - ('I', 'include', [], _('include names matching the given patterns')), - ('X', 'exclude', [], _('exclude names matching the given patterns')), ('m', 'message', '', _('use <text> as commit message')), ('l', 'logfile', '', _('read the commit message from <file>')), ('d', 'date', '', _('record datecode as commit date')), - ('u', 'user', '', _('record user as commiter'))], + ('u', 'user', '', _('record user as commiter')), + ('I', 'include', [], _('include names matching the given patterns')), + ('X', 'exclude', [], _('exclude names matching the given patterns'))], _('hg commit [OPTION]... [FILE]...')), "copy|cp": (copy, - [('I', 'include', [], _('include names matching the given patterns')), - ('X', 'exclude', [], _('exclude names matching the given patterns')), - ('A', 'after', None, _('record a copy that has already occurred')), + [('A', 'after', None, _('record a copy that has already occurred')), ('f', 'force', None, - _('forcibly copy over an existing managed file'))], + _('forcibly copy over an existing managed file')), + ('I', 'include', [], _('include names matching the given patterns')), + ('X', 'exclude', [], _('exclude names matching the given patterns'))], _('hg copy [OPTION]... [SOURCE]... DEST')), "debugancestor": (debugancestor, [], _('debugancestor INDEX REV1 REV2')), + "debugcomplete": (debugcomplete, [], _('debugcomplete CMD')), "debugrebuildstate": (debugrebuildstate, - [('r', 'rev', "", _("revision to rebuild to"))], + [('r', 'rev', '', _('revision to rebuild to'))], _('debugrebuildstate [-r REV] [REV]')), "debugcheckstate": (debugcheckstate, [], _('debugcheckstate')), "debugconfig": (debugconfig, [], _('debugconfig')), @@ -2635,20 +2662,19 @@ (diff, [('r', 'rev', [], _('revision')), ('a', 'text', None, _('treat all files as text')), - ('I', 'include', [], _('include names matching the given patterns')), ('p', 'show-function', None, _('show which function each change is in')), ('w', 'ignore-all-space', None, _('ignore white space when comparing lines')), - ('X', 'exclude', [], - _('exclude names matching the given patterns'))], + ('I', 'include', [], _('include names matching the given patterns')), + ('X', 'exclude', [], _('exclude names matching the given patterns'))], _('hg diff [-a] [-I] [-X] [-r REV1 [-r REV2]] [FILE]...')), "^export": (export, [('o', 'output', '', _('print output to file with formatted name')), ('a', 'text', None, _('treat all files as text')), ('', 'switch-parent', None, _('diff against the second parent'))], - _('hg export [-a] [-o OUTFILE] REV...')), + _('hg export [-a] [-o OUTFILESPEC] REV...')), "forget": (forget, [('I', 'include', [], _('include names matching the given patterns')), @@ -2657,15 +2683,15 @@ "grep": (grep, [('0', 'print0', None, _('end fields with NUL')), - ('I', 'include', [], _('include names matching the given patterns')), - ('X', 'exclude', [], _('exclude names matching the given patterns')), ('', 'all', None, _('print all revisions that match')), ('i', 'ignore-case', None, _('ignore case when matching')), ('l', 'files-with-matches', None, _('print only filenames and revs that match')), ('n', 'line-number', None, _('print matching line numbers')), ('r', 'rev', [], _('search in given revision range')), - ('u', 'user', None, _('print user who committed change'))], + ('u', 'user', None, _('print user who committed change')), + ('I', 'include', [], _('include names matching the given patterns')), + ('X', 'exclude', [], _('exclude names matching the given patterns'))], _('hg grep [OPTION]... PATTERN [FILE]...')), "heads": (heads, @@ -2681,10 +2707,10 @@ [('p', 'strip', 1, _('directory strip option for patch. This has the same\n') + _('meaning as the corresponding patch option')), + ('b', 'base', '', _('base path')), ('f', 'force', None, - _('skip check for outstanding uncommitted changes')), - ('b', 'base', '', _('base path'))], - _('hg import [-f] [-p NUM] [-b BASE] PATCH...')), + _('skip check for outstanding uncommitted changes'))], + _('hg import [-p NUM] [-b BASE] [-f] PATCH...')), "incoming|in": (incoming, [('M', 'no-merges', None, _('do not show merges')), ('', 'style', '', _('display using template map file')), @@ -2705,9 +2731,7 @@ _('hg locate [OPTION]... [PATTERN]...')), "^log|history": (log, - [('I', 'include', [], _('include names matching the given patterns')), - ('X', 'exclude', [], _('exclude names matching the given patterns')), - ('b', 'branches', None, _('show branches')), + [('b', 'branches', None, _('show branches')), ('k', 'keyword', [], _('search for a keyword')), ('l', 'limit', '', _('limit number of changes displayed')), ('r', 'rev', [], _('show the specified revision or range')), @@ -2715,8 +2739,10 @@ ('', 'style', '', _('display using template map file')), ('m', 'only-merges', None, _('show only merges')), ('p', 'patch', None, _('show patch')), - ('', 'template', '', _('display with template'))], - _('hg log [-I] [-X] [-r REV]... [-p] [FILE]')), + ('', 'template', '', _('display with template')), + ('I', 'include', [], _('include names matching the given patterns')), + ('X', 'exclude', [], _('exclude names matching the given patterns'))], + _('hg log [OPTION]... [FILE]')), "manifest": (manifest, [], _('hg manifest [REV]')), "outgoing|out": (outgoing, [('M', 'no-merges', None, _('do not show merges')), @@ -2724,7 +2750,7 @@ ('', 'style', '', _('display using template map file')), ('n', 'newest-first', None, _('show newest record first')), ('', 'template', '', _('display with template'))], - _('hg outgoing [-p] [-n] [-M] [DEST]')), + _('hg outgoing [-M] [-p] [-n] [DEST]')), "^parents": (parents, [('b', 'branches', None, _('show branches')), @@ -2740,7 +2766,7 @@ ('r', 'rev', [], _('a specific revision you would like to pull')), ('', 'remotecmd', '', _('specify hg command to run on the remote side'))], - _('hg pull [-u] [-e FILE] [-r rev]... [--remotecmd FILE] [SOURCE]')), + _('hg pull [-u] [-e FILE] [-r REV]... [--remotecmd FILE] [SOURCE]')), "^push": (push, [('f', 'force', None, _('force push')), @@ -2748,8 +2774,8 @@ ('r', 'rev', [], _('a specific revision you would like to push')), ('', 'remotecmd', '', _('specify hg command to run on the remote side'))], - _('hg push [-f] [-e FILE] [-r rev]... [--remotecmd FILE] [DEST]')), - "rawcommit": + _('hg push [-f] [-e FILE] [-r REV]... [--remotecmd FILE] [DEST]')), + "debugrawcommit|rawcommit": (rawcommit, [('p', 'parent', [], _('parent')), ('d', 'date', '', _('date code')), @@ -2757,27 +2783,28 @@ ('F', 'files', '', _('file list')), ('m', 'message', '', _('commit message')), ('l', 'logfile', '', _('commit message file'))], - _('hg rawcommit [OPTION]... [FILE]...')), + _('hg debugrawcommit [OPTION]... [FILE]...')), "recover": (recover, [], _('hg recover')), "^remove|rm": (remove, - [('I', 'include', [], _('include names matching the given patterns')), + [('f', 'force', None, _('remove file even if modified')), + ('I', 'include', [], _('include names matching the given patterns')), ('X', 'exclude', [], _('exclude names matching the given patterns'))], _('hg remove [OPTION]... FILE...')), "rename|mv": (rename, - [('I', 'include', [], _('include names matching the given patterns')), - ('X', 'exclude', [], _('exclude names matching the given patterns')), - ('A', 'after', None, _('record a rename that has already occurred')), + [('A', 'after', None, _('record a rename that has already occurred')), ('f', 'force', None, - _('forcibly copy over an existing managed file'))], - _('hg rename [OPTION]... [SOURCE]... DEST')), + _('forcibly copy over an existing managed file')), + ('I', 'include', [], _('include names matching the given patterns')), + ('X', 'exclude', [], _('exclude names matching the given patterns'))], + _('hg rename [OPTION]... SOURCE... DEST')), "^revert": (revert, - [('I', 'include', [], _('include names matching the given patterns')), - ('X', 'exclude', [], _('exclude names matching the given patterns')), - ('r', 'rev', '', _('revision to revert to'))], - _('hg revert [-n] [-r REV] [NAME]...')), + [('r', 'rev', '', _('revision to revert to')), + ('I', 'include', [], _('include names matching the given patterns')), + ('X', 'exclude', [], _('exclude names matching the given patterns'))], + _('hg revert [-r REV] [NAME]...')), "root": (root, [], _('hg root')), "^serve": (serve, @@ -2791,7 +2818,7 @@ _('name to show in web pages (default: working dir)')), ('', 'pid-file', '', _('name of file to write process ID to')), ('', 'stdio', None, _('for remote clients')), - ('', 'templates', '', _('web templates to use')), + ('t', 'templates', '', _('web templates to use')), ('', 'style', '', _('template style to use')), ('6', 'ipv6', None, _('use IPv6 in addition to IPv4'))], _('hg serve [OPTION]...')), @@ -2815,7 +2842,7 @@ ('d', 'date', '', _('record datecode as commit date')), ('u', 'user', '', _('record user as commiter')), ('r', 'rev', '', _('revision to tag'))], - _('hg tag [-r REV] [OPTION]... NAME')), + _('hg tag [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME')), "tags": (tags, [], _('hg tags')), "tip": (tip, @@ -2823,7 +2850,7 @@ ('', 'style', '', _('display using template map file')), ('p', 'patch', None, _('show patch')), ('', 'template', '', _('display with template'))], - _('hg [-b] [-p] tip')), + _('hg tip [-b] [-p]')), "unbundle": (unbundle, [('u', 'update', None, @@ -2844,7 +2871,8 @@ } globalopts = [ - ('R', 'repository', '', _('repository root directory')), + ('R', 'repository', '', + _('repository root directory or symbolic path name')), ('', 'cwd', '', _('change working directory')), ('y', 'noninteractive', None, _('do not prompt, assume \'yes\' for any required answers')), @@ -2859,28 +2887,49 @@ ('h', 'help', None, _('display help and exit')), ] -norepo = ("clone init version help debugancestor debugconfig debugdata" - " debugindex debugindexdot paths") - -def find(cmd): - """Return (aliases, command table entry) for command string.""" - choice = None - count = 0 +norepo = ("clone init version help debugancestor debugcomplete debugdata" + " debugindex debugindexdot") +optionalrepo = ("paths debugconfig") + +def findpossible(cmd): + """ + Return cmd -> (aliases, command table entry) + for each matching command + """ + choice = {} + debugchoice = {} for e in table.keys(): aliases = e.lstrip("^").split("|") if cmd in aliases: - return aliases, table[e] + choice[cmd] = (aliases, table[e]) + continue for a in aliases: if a.startswith(cmd): - count += 1 - choice = aliases, table[e] + if aliases[0].startswith("debug"): + debugchoice[a] = (aliases, table[e]) + else: + choice[a] = (aliases, table[e]) break - if count > 1: - raise AmbiguousCommand(cmd) + if not choice and debugchoice: + choice = debugchoice + + return choice + +def find(cmd): + """Return (aliases, command table entry) for command string.""" + choice = findpossible(cmd) + + if choice.has_key(cmd): + return choice[cmd] + + if len(choice) > 1: + clist = choice.keys() + clist.sort() + raise AmbiguousCommand(cmd, clist) if choice: - return choice + return choice.values()[0] raise UnknownCommand(cmd) @@ -2968,7 +3017,10 @@ mod = getattr(mod, comp) return mod try: - mod = importh(x[0]) + try: + mod = importh("hgext." + x[0]) + except ImportError: + mod = importh(x[0]) except Exception, inst: on_exception(Exception, inst) continue @@ -2983,6 +3035,93 @@ try: cmd, func, args, options, cmdoptions = parse(u, args) + 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) + + u.updateopts(options["verbose"], options["debug"], options["quiet"], + not options["noninteractive"]) + + # enter the debugger before command execution + if options['debugger']: + pdb.set_trace() + + try: + if options['cwd']: + try: + os.chdir(options['cwd']) + except OSError, inst: + raise util.Abort('%s: %s' % + (options['cwd'], inst.strerror)) + + path = u.expandpath(options["repository"]) or "" + repo = path and hg.repository(u, path=path) or None + + if options['help']: + help_(u, cmd, options['version']) + sys.exit(0) + elif options['version']: + show_version(u) + sys.exit(0) + elif not cmd: + help_(u, 'shortlist') + sys.exit(0) + + if cmd not in norepo.split(): + try: + if not repo: + repo = hg.repository(u, path=path) + u = repo.ui + for x in external: + if hasattr(x, 'reposetup'): + x.reposetup(u, repo) + except hg.RepoError: + if cmd not in optionalrepo.split(): + raise + d = lambda: func(u, repo, *args, **cmdoptions) + else: + d = lambda: func(u, *args, **cmdoptions) + + try: + if options['profile']: + import hotshot, hotshot.stats + prof = hotshot.Profile("hg.prof") + try: + try: + return prof.runcall(d) + except: + try: + u.warn(_('exception raised - generating ' + 'profile anyway\n')) + except: + pass + raise + finally: + prof.close() + stats = hotshot.stats.load("hg.prof") + stats.strip_dirs() + stats.sort_stats('time', 'calls') + stats.print_stats(40) + else: + return d() + finally: + u.flush() + except: + # enter the debugger when we hit an exception + if options['debugger']: + pdb.post_mortem(sys.exc_info()[2]) + if options['traceback']: + traceback.print_exc() + raise except ParseError, inst: if inst.args[0]: u.warn(_("hg %s: %s\n") % (inst.args[0], inst.args[1])) @@ -2992,81 +3131,13 @@ help_(u, 'shortlist') sys.exit(-1) except AmbiguousCommand, inst: - u.warn(_("hg: command '%s' is ambiguous.\n") % inst.args[0]) + u.warn(_("hg: command '%s' is ambiguous:\n %s\n") % + (inst.args[0], " ".join(inst.args[1]))) sys.exit(1) except UnknownCommand, inst: u.warn(_("hg: unknown command '%s'\n") % inst.args[0]) help_(u, 'shortlist') sys.exit(1) - - 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) - - u.updateopts(options["verbose"], options["debug"], options["quiet"], - not options["noninteractive"]) - - # enter the debugger before command execution - if options['debugger']: - pdb.set_trace() - - try: - try: - if options['help']: - help_(u, cmd, options['version']) - sys.exit(0) - elif options['version']: - show_version(u) - sys.exit(0) - elif not cmd: - help_(u, 'shortlist') - sys.exit(0) - - if options['cwd']: - try: - os.chdir(options['cwd']) - except OSError, inst: - raise util.Abort('%s: %s' % - (options['cwd'], inst.strerror)) - - if cmd not in norepo.split(): - path = options["repository"] or "" - repo = hg.repository(ui=u, path=path) - for x in external: - if hasattr(x, 'reposetup'): - x.reposetup(u, repo) - d = lambda: func(u, repo, *args, **cmdoptions) - else: - d = lambda: func(u, *args, **cmdoptions) - - 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: - # enter the debugger when we hit an exception - if options['debugger']: - pdb.post_mortem(sys.exc_info()[2]) - if options['traceback']: - traceback.print_exc() - raise except hg.RepoError, inst: u.warn(_("abort: "), inst, "!\n") except revlog.RevlogError, inst: @@ -3113,12 +3184,6 @@ u.debug(inst, "\n") u.warn(_("%s: invalid arguments\n") % cmd) help_(u, cmd) - except AmbiguousCommand, inst: - u.warn(_("hg: command '%s' is ambiguous.\n") % inst.args[0]) - help_(u, 'shortlist') - except UnknownCommand, inst: - u.warn(_("hg: unknown command '%s'\n") % inst.args[0]) - help_(u, 'shortlist') except SystemExit: # don't catch this in the catch-all below raise