comparison 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
comparison
equal deleted inserted replaced
1919:8f565af14095 1920:b7cc0f323a4c
274 pathname), 274 pathname),
275 mode) 275 mode)
276 276
277 def dodiff(fp, ui, repo, node1, node2, files=None, match=util.always, 277 def dodiff(fp, ui, repo, node1, node2, files=None, match=util.always,
278 changes=None, text=False, opts={}): 278 changes=None, text=False, opts={}):
279 if not node1:
280 node1 = repo.dirstate.parents()[0]
281 # reading the data for node1 early allows it to play nicely
282 # with repo.changes and the revlog cache.
283 change = repo.changelog.read(node1)
284 mmap = repo.manifest.read(change[0])
285 date1 = util.datestr(change[2])
286
279 if not changes: 287 if not changes:
280 changes = repo.changes(node1, node2, files, match=match) 288 changes = repo.changes(node1, node2, files, match=match)
281 modified, added, removed, deleted, unknown = changes 289 modified, added, removed, deleted, unknown = changes
282 if files: 290 if files:
283 modified, added, removed = map(lambda x: filterfiles(files, x), 291 modified, added, removed = map(lambda x: filterfiles(files, x),
292 date2 = util.datestr(change[2]) 300 date2 = util.datestr(change[2])
293 def read(f): 301 def read(f):
294 return repo.file(f).read(mmap2[f]) 302 return repo.file(f).read(mmap2[f])
295 else: 303 else:
296 date2 = util.datestr() 304 date2 = util.datestr()
297 if not node1:
298 node1 = repo.dirstate.parents()[0]
299 def read(f): 305 def read(f):
300 return repo.wread(f) 306 return repo.wread(f)
301 307
302 if ui.quiet: 308 if ui.quiet:
303 r = None 309 r = None
304 else: 310 else:
305 hexfunc = ui.verbose and hex or short 311 hexfunc = ui.verbose and hex or short
306 r = [hexfunc(node) for node in [node1, node2] if node] 312 r = [hexfunc(node) for node in [node1, node2] if node]
307
308 change = repo.changelog.read(node1)
309 mmap = repo.manifest.read(change[0])
310 date1 = util.datestr(change[2])
311 313
312 diffopts = ui.diffopts() 314 diffopts = ui.diffopts()
313 showfunc = opts.get('show_function') or diffopts['showfunc'] 315 showfunc = opts.get('show_function') or diffopts['showfunc']
314 ignorews = opts.get('ignore_all_space') or diffopts['ignorews'] 316 ignorews = opts.get('ignore_all_space') or diffopts['ignorews']
315 for f in modified: 317 for f in modified:
791 else: 793 else:
792 node = repo.dirstate.parents()[0] 794 node = repo.dirstate.parents()[0]
793 change = repo.changelog.read(node) 795 change = repo.changelog.read(node)
794 mmap = repo.manifest.read(change[0]) 796 mmap = repo.manifest.read(change[0])
795 797
796 for src, abs, rel, exact in walk(repo, pats, opts): 798 for src, abs, rel, exact in walk(repo, pats, opts, node=node):
797 if abs not in mmap:
798 ui.warn(_("warning: %s is not in the repository!\n") %
799 ((pats and rel) or abs))
800 continue
801
802 f = repo.file(abs) 799 f = repo.file(abs)
803 if not opts['text'] and util.binary(f.read(mmap[abs])): 800 if not opts['text'] and util.binary(f.read(mmap[abs])):
804 ui.write(_("%s: binary file\n") % ((pats and rel) or abs)) 801 ui.write(_("%s: binary file\n") % ((pats and rel) or abs))
805 continue 802 continue
806 803
832 829
833 Unlike import/export, this exactly preserves all changeset 830 Unlike import/export, this exactly preserves all changeset
834 contents including permissions, rename data, and revision history. 831 contents including permissions, rename data, and revision history.
835 """ 832 """
836 f = open(fname, "wb") 833 f = open(fname, "wb")
837 dest = ui.expandpath(dest, repo.root) 834 dest = ui.expandpath(dest)
838 other = hg.repository(ui, dest) 835 other = hg.repository(ui, dest)
839 o = repo.findoutgoing(other) 836 o = repo.findoutgoing(other)
840 cg = repo.changegroup(o, 'bundle') 837 cg = repo.changegroup(o, 'bundle')
841 838
842 try: 839 try:
894 For efficiency, hardlinks are used for cloning whenever the source 891 For efficiency, hardlinks are used for cloning whenever the source
895 and destination are on the same filesystem. Some filesystems, 892 and destination are on the same filesystem. Some filesystems,
896 such as AFS, implement hardlinking incorrectly, but do not report 893 such as AFS, implement hardlinking incorrectly, but do not report
897 errors. In these cases, use the --pull option to avoid 894 errors. In these cases, use the --pull option to avoid
898 hardlinking. 895 hardlinking.
896
897 See pull for valid source format details.
899 """ 898 """
900 if dest is None: 899 if dest is None:
901 dest = os.path.basename(os.path.normpath(source)) 900 dest = os.path.basename(os.path.normpath(source))
902 901
903 if os.path.exists(dest): 902 if os.path.exists(dest):
919 if opts['ssh']: 918 if opts['ssh']:
920 ui.setconfig("ui", "ssh", opts['ssh']) 919 ui.setconfig("ui", "ssh", opts['ssh'])
921 if opts['remotecmd']: 920 if opts['remotecmd']:
922 ui.setconfig("ui", "remotecmd", opts['remotecmd']) 921 ui.setconfig("ui", "remotecmd", opts['remotecmd'])
923 922
924 if not os.path.exists(source): 923 source = ui.expandpath(source)
925 source = ui.expandpath(source)
926 924
927 d = Dircleanup(dest) 925 d = Dircleanup(dest)
928 abspath = source 926 abspath = source
929 other = hg.repository(ui, source) 927 other = hg.repository(ui, source)
930 928
976 f.write("[paths]\n") 974 f.write("[paths]\n")
977 f.write("default = %s\n" % abspath) 975 f.write("default = %s\n" % abspath)
978 f.close() 976 f.close()
979 977
980 if not opts['noupdate']: 978 if not opts['noupdate']:
981 update(ui, repo) 979 update(repo.ui, repo)
982 980
983 d.close() 981 d.close()
984 982
985 def commit(ui, repo, *pats, **opts): 983 def commit(ui, repo, *pats, **opts):
986 """commit the specified files or all outstanding changes 984 """commit the specified files or all outstanding changes
1021 try: 1019 try:
1022 repo.commit(files, message, opts['user'], opts['date'], match) 1020 repo.commit(files, message, opts['user'], opts['date'], match)
1023 except ValueError, inst: 1021 except ValueError, inst:
1024 raise util.Abort(str(inst)) 1022 raise util.Abort(str(inst))
1025 1023
1026 def docopy(ui, repo, pats, opts): 1024 def docopy(ui, repo, pats, opts, wlock):
1025 # called with the repo lock held
1027 cwd = repo.getcwd() 1026 cwd = repo.getcwd()
1028 errors = 0 1027 errors = 0
1029 copied = [] 1028 copied = []
1030 targets = {} 1029 targets = {}
1031 1030
1067 else: 1066 else:
1068 targetdir = os.path.dirname(reltarget) or '.' 1067 targetdir = os.path.dirname(reltarget) or '.'
1069 if not os.path.isdir(targetdir): 1068 if not os.path.isdir(targetdir):
1070 os.makedirs(targetdir) 1069 os.makedirs(targetdir)
1071 try: 1070 try:
1072 shutil.copyfile(relsrc, reltarget) 1071 restore = repo.dirstate.state(abstarget) == 'r'
1073 shutil.copymode(relsrc, reltarget) 1072 if restore:
1073 repo.undelete([abstarget], wlock)
1074 try:
1075 shutil.copyfile(relsrc, reltarget)
1076 shutil.copymode(relsrc, reltarget)
1077 restore = False
1078 finally:
1079 if restore:
1080 repo.remove([abstarget], wlock)
1074 except shutil.Error, inst: 1081 except shutil.Error, inst:
1075 raise util.Abort(str(inst)) 1082 raise util.Abort(str(inst))
1076 except IOError, inst: 1083 except IOError, inst:
1077 if inst.errno == errno.ENOENT: 1084 if inst.errno == errno.ENOENT:
1078 ui.warn(_('%s: deleted in working copy\n') % relsrc) 1085 ui.warn(_('%s: deleted in working copy\n') % relsrc)
1082 errors += 1 1089 errors += 1
1083 return 1090 return
1084 if ui.verbose or not exact: 1091 if ui.verbose or not exact:
1085 ui.status(_('copying %s to %s\n') % (relsrc, reltarget)) 1092 ui.status(_('copying %s to %s\n') % (relsrc, reltarget))
1086 targets[abstarget] = abssrc 1093 targets[abstarget] = abssrc
1087 repo.copy(origsrc, abstarget) 1094 if abstarget != origsrc:
1095 repo.copy(origsrc, abstarget, wlock)
1088 copied.append((abssrc, relsrc, exact)) 1096 copied.append((abssrc, relsrc, exact))
1089 1097
1090 def targetpathfn(pat, dest, srcs): 1098 def targetpathfn(pat, dest, srcs):
1091 if os.path.isdir(pat): 1099 if os.path.isdir(pat):
1092 abspfx = util.canonpath(repo.root, cwd, pat) 1100 abspfx = util.canonpath(repo.root, cwd, pat)
1190 1198
1191 NOTE: This command should be treated as experimental. While it 1199 NOTE: This command should be treated as experimental. While it
1192 should properly record copied files, this information is not yet 1200 should properly record copied files, this information is not yet
1193 fully used by merge, nor fully reported by log. 1201 fully used by merge, nor fully reported by log.
1194 """ 1202 """
1195 errs, copied = docopy(ui, repo, pats, opts) 1203 try:
1204 wlock = repo.wlock(0)
1205 errs, copied = docopy(ui, repo, pats, opts, wlock)
1206 except lock.LockHeld, inst:
1207 ui.warn(_("repository lock held by %s\n") % inst.args[0])
1208 errs = 1
1196 return errs 1209 return errs
1197 1210
1198 def debugancestor(ui, index, rev1, rev2): 1211 def debugancestor(ui, index, rev1, rev2):
1199 """find the ancestor revision of two revisions in a given index""" 1212 """find the ancestor revision of two revisions in a given index"""
1200 r = revlog.revlog(util.opener(os.getcwd()), index, "") 1213 r = revlog.revlog(util.opener(os.getcwd(), audit=False), index, "")
1201 a = r.ancestor(r.lookup(rev1), r.lookup(rev2)) 1214 a = r.ancestor(r.lookup(rev1), r.lookup(rev2))
1202 ui.write("%d:%s\n" % (r.rev(a), hex(a))) 1215 ui.write("%d:%s\n" % (r.rev(a), hex(a)))
1216
1217 def debugcomplete(ui, cmd):
1218 """returns the completion list associated with the given command"""
1219 clist = findpossible(cmd).keys()
1220 clist.sort()
1221 ui.write("%s\n" % " ".join(clist))
1203 1222
1204 def debugrebuildstate(ui, repo, rev=None): 1223 def debugrebuildstate(ui, repo, rev=None):
1205 """rebuild the dirstate as it would look like for the given revision""" 1224 """rebuild the dirstate as it would look like for the given revision"""
1206 if not rev: 1225 if not rev:
1207 rev = repo.changelog.tip() 1226 rev = repo.changelog.tip()
1244 errors += 1 1263 errors += 1
1245 if errors: 1264 if errors:
1246 error = _(".hg/dirstate inconsistent with current parent's manifest") 1265 error = _(".hg/dirstate inconsistent with current parent's manifest")
1247 raise util.Abort(error) 1266 raise util.Abort(error)
1248 1267
1249 def debugconfig(ui): 1268 def debugconfig(ui, repo):
1250 """show combined config settings from all hgrc files""" 1269 """show combined config settings from all hgrc files"""
1251 try:
1252 repo = hg.repository(ui)
1253 except hg.RepoError:
1254 pass
1255 for section, name, value in ui.walkconfig(): 1270 for section, name, value in ui.walkconfig():
1256 ui.write('%s.%s=%s\n' % (section, name, value)) 1271 ui.write('%s.%s=%s\n' % (section, name, value))
1257 1272
1258 def debugsetparents(ui, repo, rev1, rev2=None): 1273 def debugsetparents(ui, repo, rev1, rev2=None):
1259 """manually set the parents of the current working directory 1274 """manually set the parents of the current working directory
1281 for f in repo.dirstate.copies: 1296 for f in repo.dirstate.copies:
1282 ui.write(_("copy: %s -> %s\n") % (repo.dirstate.copies[f], f)) 1297 ui.write(_("copy: %s -> %s\n") % (repo.dirstate.copies[f], f))
1283 1298
1284 def debugdata(ui, file_, rev): 1299 def debugdata(ui, file_, rev):
1285 """dump the contents of an data file revision""" 1300 """dump the contents of an data file revision"""
1286 r = revlog.revlog(util.opener(os.getcwd()), file_[:-2] + ".i", file_) 1301 r = revlog.revlog(util.opener(os.getcwd(), audit=False),
1302 file_[:-2] + ".i", file_)
1287 try: 1303 try:
1288 ui.write(r.revision(r.lookup(rev))) 1304 ui.write(r.revision(r.lookup(rev)))
1289 except KeyError: 1305 except KeyError:
1290 raise util.Abort(_('invalid revision identifier %s'), rev) 1306 raise util.Abort(_('invalid revision identifier %s'), rev)
1291 1307
1292 def debugindex(ui, file_): 1308 def debugindex(ui, file_):
1293 """dump the contents of an index file""" 1309 """dump the contents of an index file"""
1294 r = revlog.revlog(util.opener(os.getcwd()), file_, "") 1310 r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_, "")
1295 ui.write(" rev offset length base linkrev" + 1311 ui.write(" rev offset length base linkrev" +
1296 " nodeid p1 p2\n") 1312 " nodeid p1 p2\n")
1297 for i in range(r.count()): 1313 for i in range(r.count()):
1298 e = r.index[i] 1314 e = r.index[i]
1299 ui.write("% 6d % 9d % 7d % 6d % 7d %s %s %s\n" % ( 1315 ui.write("% 6d % 9d % 7d % 6d % 7d %s %s %s\n" % (
1300 i, e[0], e[1], e[2], e[3], 1316 i, e[0], e[1], e[2], e[3],
1301 short(e[6]), short(e[4]), short(e[5]))) 1317 short(e[6]), short(e[4]), short(e[5])))
1302 1318
1303 def debugindexdot(ui, file_): 1319 def debugindexdot(ui, file_):
1304 """dump an index DAG as a .dot file""" 1320 """dump an index DAG as a .dot file"""
1305 r = revlog.revlog(util.opener(os.getcwd()), file_, "") 1321 r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_, "")
1306 ui.write("digraph G {\n") 1322 ui.write("digraph G {\n")
1307 for i in range(r.count()): 1323 for i in range(r.count()):
1308 e = r.index[i] 1324 e = r.index[i]
1309 ui.write("\t%d -> %d\n" % (r.rev(e[4]), i)) 1325 ui.write("\t%d -> %d\n" % (r.rev(e[4]), i))
1310 if e[5] != nullid: 1326 if e[5] != nullid:
1728 pull repo. These are the changesets that would be pulled if a pull 1744 pull repo. These are the changesets that would be pulled if a pull
1729 was requested. 1745 was requested.
1730 1746
1731 Currently only local repositories are supported. 1747 Currently only local repositories are supported.
1732 """ 1748 """
1733 source = ui.expandpath(source, repo.root) 1749 source = ui.expandpath(source)
1734 other = hg.repository(ui, source) 1750 other = hg.repository(ui, source)
1735 if not other.local(): 1751 if not other.local():
1736 raise util.Abort(_("incoming doesn't work for remote repositories yet")) 1752 raise util.Abort(_("incoming doesn't work for remote repositories yet"))
1737 o = repo.findincoming(other) 1753 o = repo.findincoming(other)
1738 if not o: 1754 if not o:
1915 """show changesets not found in destination 1931 """show changesets not found in destination
1916 1932
1917 Show changesets not found in the specified destination repo or the 1933 Show changesets not found in the specified destination repo or the
1918 default push repo. These are the changesets that would be pushed 1934 default push repo. These are the changesets that would be pushed
1919 if a push was requested. 1935 if a push was requested.
1920 """ 1936
1921 dest = ui.expandpath(dest, repo.root) 1937 See pull for valid source format details.
1938 """
1939 dest = ui.expandpath(dest)
1922 other = hg.repository(ui, dest) 1940 other = hg.repository(ui, dest)
1923 o = repo.findoutgoing(other) 1941 o = repo.findoutgoing(other)
1924 o = repo.changelog.nodesbetween(o)[0] 1942 o = repo.changelog.nodesbetween(o)[0]
1925 if opts['newest_first']: 1943 if opts['newest_first']:
1926 o.reverse() 1944 o.reverse()
1951 displayer = show_changeset(ui, repo, opts) 1969 displayer = show_changeset(ui, repo, opts)
1952 for n in p: 1970 for n in p:
1953 if n != nullid: 1971 if n != nullid:
1954 displayer.show(changenode=n, brinfo=br) 1972 displayer.show(changenode=n, brinfo=br)
1955 1973
1956 def paths(ui, search=None): 1974 def paths(ui, repo, search=None):
1957 """show definition of symbolic path names 1975 """show definition of symbolic path names
1958 1976
1959 Show definition of symbolic path name NAME. If no name is given, show 1977 Show definition of symbolic path name NAME. If no name is given, show
1960 definition of available names. 1978 definition of available names.
1961 1979
1962 Path names are defined in the [paths] section of /etc/mercurial/hgrc 1980 Path names are defined in the [paths] section of /etc/mercurial/hgrc
1963 and $HOME/.hgrc. If run inside a repository, .hg/hgrc is used, too. 1981 and $HOME/.hgrc. If run inside a repository, .hg/hgrc is used, too.
1964 """ 1982 """
1965 try:
1966 repo = hg.repository(ui=ui)
1967 except hg.RepoError:
1968 pass
1969
1970 if search: 1983 if search:
1971 for name, path in ui.configitems("paths"): 1984 for name, path in ui.configitems("paths"):
1972 if name == search: 1985 if name == search:
1973 ui.write("%s\n" % path) 1986 ui.write("%s\n" % path)
1974 return 1987 return
1997 SSH requires an accessible shell account on the destination machine 2010 SSH requires an accessible shell account on the destination machine
1998 and a copy of hg in the remote path. With SSH, paths are relative 2011 and a copy of hg in the remote path. With SSH, paths are relative
1999 to the remote user's home directory by default; use two slashes at 2012 to the remote user's home directory by default; use two slashes at
2000 the start of a path to specify it as relative to the filesystem root. 2013 the start of a path to specify it as relative to the filesystem root.
2001 """ 2014 """
2002 source = ui.expandpath(source, repo.root) 2015 source = ui.expandpath(source)
2003 ui.status(_('pulling from %s\n') % (source)) 2016 ui.status(_('pulling from %s\n') % (source))
2004 2017
2005 if opts['ssh']: 2018 if opts['ssh']:
2006 ui.setconfig("ui", "ssh", opts['ssh']) 2019 ui.setconfig("ui", "ssh", opts['ssh'])
2007 if opts['remotecmd']: 2020 if opts['remotecmd']:
2042 ssh://[user@]host[:port][/path] 2055 ssh://[user@]host[:port][/path]
2043 2056
2044 SSH requires an accessible shell account on the destination 2057 SSH requires an accessible shell account on the destination
2045 machine and a copy of hg in the remote path. 2058 machine and a copy of hg in the remote path.
2046 """ 2059 """
2047 dest = ui.expandpath(dest, repo.root) 2060 dest = ui.expandpath(dest)
2048 ui.status('pushing to %s\n' % (dest)) 2061 ui.status('pushing to %s\n' % (dest))
2049 2062
2050 if opts['ssh']: 2063 if opts['ssh']:
2051 ui.setconfig("ui", "ssh", opts['ssh']) 2064 ui.setconfig("ui", "ssh", opts['ssh'])
2052 if opts['remotecmd']: 2065 if opts['remotecmd']:
2060 return r 2073 return r
2061 2074
2062 def rawcommit(ui, repo, *flist, **rc): 2075 def rawcommit(ui, repo, *flist, **rc):
2063 """raw commit interface (DEPRECATED) 2076 """raw commit interface (DEPRECATED)
2064 2077
2078 (DEPRECATED)
2065 Lowlevel commit, for use in helper scripts. 2079 Lowlevel commit, for use in helper scripts.
2066 2080
2067 This command is not intended to be used by normal users, as it is 2081 This command is not intended to be used by normal users, as it is
2068 primarily useful for importing from other SCMs. 2082 primarily useful for importing from other SCMs.
2069 2083
2117 """ 2131 """
2118 names = [] 2132 names = []
2119 def okaytoremove(abs, rel, exact): 2133 def okaytoremove(abs, rel, exact):
2120 modified, added, removed, deleted, unknown = repo.changes(files=[abs]) 2134 modified, added, removed, deleted, unknown = repo.changes(files=[abs])
2121 reason = None 2135 reason = None
2122 if modified: 2136 if modified and not opts['force']:
2123 reason = _('is modified') 2137 reason = _('is modified')
2124 elif added: 2138 elif added:
2125 reason = _('has been marked for add') 2139 reason = _('has been marked for add')
2126 elif unknown: 2140 elif unknown:
2127 reason = _('is not managed') 2141 reason = _('is not managed')
2152 2166
2153 NOTE: This command should be treated as experimental. While it 2167 NOTE: This command should be treated as experimental. While it
2154 should properly record rename files, this information is not yet 2168 should properly record rename files, this information is not yet
2155 fully used by merge, nor fully reported by log. 2169 fully used by merge, nor fully reported by log.
2156 """ 2170 """
2157 errs, copied = docopy(ui, repo, pats, opts) 2171 try:
2158 names = [] 2172 wlock = repo.wlock(0)
2159 for abs, rel, exact in copied: 2173 errs, copied = docopy(ui, repo, pats, opts, wlock)
2160 if ui.verbose or not exact: 2174 names = []
2161 ui.status(_('removing %s\n') % rel) 2175 for abs, rel, exact in copied:
2162 names.append(abs) 2176 if ui.verbose or not exact:
2163 repo.remove(names, unlink=True) 2177 ui.status(_('removing %s\n') % rel)
2178 names.append(abs)
2179 repo.remove(names, True, wlock)
2180 except lock.LockHeld, inst:
2181 ui.warn(_("repository lock held by %s\n") % inst.args[0])
2182 errs = 1
2164 return errs 2183 return errs
2165 2184
2166 def revert(ui, repo, *pats, **opts): 2185 def revert(ui, repo, *pats, **opts):
2167 """revert modified files or dirs back to their unmodified states 2186 """revert modified files or dirs back to their unmodified states
2168 2187
2169 Revert any uncommitted modifications made to the named files or 2188 In its default mode, it reverts any uncommitted modifications made
2170 directories. This restores the contents of the affected files to 2189 to the named files or directories. This restores the contents of
2171 an unmodified state. 2190 the affected files to an unmodified state.
2191
2192 Using the -r option, it reverts the given files or directories to
2193 their state as of an earlier revision. This can be helpful to "roll
2194 back" some or all of a change that should not have been committed.
2195
2196 Revert modifies the working directory. It does not commit any
2197 changes, or change the parent of the current working directory.
2172 2198
2173 If a file has been deleted, it is recreated. If the executable 2199 If a file has been deleted, it is recreated. If the executable
2174 mode of a file was changed, it is reset. 2200 mode of a file was changed, it is reset.
2175 2201
2176 If names are given, all files matching the names are reverted. 2202 If names are given, all files matching the names are reverted.
2181 repo.dirstate.parents()[0] 2207 repo.dirstate.parents()[0]
2182 2208
2183 files, choose, anypats = matchpats(repo, pats, opts) 2209 files, choose, anypats = matchpats(repo, pats, opts)
2184 modified, added, removed, deleted, unknown = repo.changes(match=choose) 2210 modified, added, removed, deleted, unknown = repo.changes(match=choose)
2185 repo.forget(added) 2211 repo.forget(added)
2186 repo.undelete(removed + deleted) 2212 repo.undelete(removed)
2187 2213
2188 return repo.update(node, False, True, choose, False) 2214 return repo.update(node, False, True, choose, False)
2189 2215
2190 def root(ui, repo): 2216 def root(ui, repo):
2191 """print the root (top) of the current working dir 2217 """print the root (top) of the current working dir
2571 ('d', 'date', None, _('list the date')), 2597 ('d', 'date', None, _('list the date')),
2572 ('n', 'number', None, _('list the revision number (default)')), 2598 ('n', 'number', None, _('list the revision number (default)')),
2573 ('c', 'changeset', None, _('list the changeset')), 2599 ('c', 'changeset', None, _('list the changeset')),
2574 ('I', 'include', [], _('include names matching the given patterns')), 2600 ('I', 'include', [], _('include names matching the given patterns')),
2575 ('X', 'exclude', [], _('exclude names matching the given patterns'))], 2601 ('X', 'exclude', [], _('exclude names matching the given patterns'))],
2576 _('hg annotate [OPTION]... FILE...')), 2602 _('hg annotate [-r REV] [-a] [-u] [-d] [-n] [-c] FILE...')),
2577 "bundle": 2603 "bundle":
2578 (bundle, 2604 (bundle,
2579 [], 2605 [],
2580 _('hg bundle FILE DEST')), 2606 _('hg bundle FILE DEST')),
2581 "cat": 2607 "cat":
2582 (cat, 2608 (cat,
2583 [('I', 'include', [], _('include names matching the given patterns')), 2609 [('o', 'output', '', _('print output to file with formatted name')),
2584 ('X', 'exclude', [], _('exclude names matching the given patterns')), 2610 ('r', 'rev', '', _('print the given revision')),
2585 ('o', 'output', '', _('print output to file with formatted name')), 2611 ('I', 'include', [], _('include names matching the given patterns')),
2586 ('r', 'rev', '', _('print the given revision'))], 2612 ('X', 'exclude', [], _('exclude names matching the given patterns'))],
2587 _('hg cat [OPTION]... FILE...')), 2613 _('hg cat [OPTION]... FILE...')),
2588 "^clone": 2614 "^clone":
2589 (clone, 2615 (clone,
2590 [('U', 'noupdate', None, _('do not update the new working directory')), 2616 [('U', 'noupdate', None, _('do not update the new working directory')),
2591 ('e', 'ssh', '', _('specify ssh command to use')),
2592 ('', 'pull', None, _('use pull protocol to copy metadata')),
2593 ('r', 'rev', [], 2617 ('r', 'rev', [],
2594 _('a changeset you would like to have after cloning')), 2618 _('a changeset you would like to have after cloning')),
2619 ('', 'pull', None, _('use pull protocol to copy metadata')),
2620 ('e', 'ssh', '', _('specify ssh command to use')),
2595 ('', 'remotecmd', '', 2621 ('', 'remotecmd', '',
2596 _('specify hg command to run on the remote side'))], 2622 _('specify hg command to run on the remote side'))],
2597 _('hg clone [OPTION]... SOURCE [DEST]')), 2623 _('hg clone [OPTION]... SOURCE [DEST]')),
2598 "^commit|ci": 2624 "^commit|ci":
2599 (commit, 2625 (commit,
2600 [('A', 'addremove', None, _('run addremove during commit')), 2626 [('A', 'addremove', None, _('run addremove during commit')),
2601 ('I', 'include', [], _('include names matching the given patterns')),
2602 ('X', 'exclude', [], _('exclude names matching the given patterns')),
2603 ('m', 'message', '', _('use <text> as commit message')), 2627 ('m', 'message', '', _('use <text> as commit message')),
2604 ('l', 'logfile', '', _('read the commit message from <file>')), 2628 ('l', 'logfile', '', _('read the commit message from <file>')),
2605 ('d', 'date', '', _('record datecode as commit date')), 2629 ('d', 'date', '', _('record datecode as commit date')),
2606 ('u', 'user', '', _('record user as commiter'))], 2630 ('u', 'user', '', _('record user as commiter')),
2631 ('I', 'include', [], _('include names matching the given patterns')),
2632 ('X', 'exclude', [], _('exclude names matching the given patterns'))],
2607 _('hg commit [OPTION]... [FILE]...')), 2633 _('hg commit [OPTION]... [FILE]...')),
2608 "copy|cp": 2634 "copy|cp":
2609 (copy, 2635 (copy,
2610 [('I', 'include', [], _('include names matching the given patterns')), 2636 [('A', 'after', None, _('record a copy that has already occurred')),
2611 ('X', 'exclude', [], _('exclude names matching the given patterns')),
2612 ('A', 'after', None, _('record a copy that has already occurred')),
2613 ('f', 'force', None, 2637 ('f', 'force', None,
2614 _('forcibly copy over an existing managed file'))], 2638 _('forcibly copy over an existing managed file')),
2639 ('I', 'include', [], _('include names matching the given patterns')),
2640 ('X', 'exclude', [], _('exclude names matching the given patterns'))],
2615 _('hg copy [OPTION]... [SOURCE]... DEST')), 2641 _('hg copy [OPTION]... [SOURCE]... DEST')),
2616 "debugancestor": (debugancestor, [], _('debugancestor INDEX REV1 REV2')), 2642 "debugancestor": (debugancestor, [], _('debugancestor INDEX REV1 REV2')),
2643 "debugcomplete": (debugcomplete, [], _('debugcomplete CMD')),
2617 "debugrebuildstate": 2644 "debugrebuildstate":
2618 (debugrebuildstate, 2645 (debugrebuildstate,
2619 [('r', 'rev', "", _("revision to rebuild to"))], 2646 [('r', 'rev', '', _('revision to rebuild to'))],
2620 _('debugrebuildstate [-r REV] [REV]')), 2647 _('debugrebuildstate [-r REV] [REV]')),
2621 "debugcheckstate": (debugcheckstate, [], _('debugcheckstate')), 2648 "debugcheckstate": (debugcheckstate, [], _('debugcheckstate')),
2622 "debugconfig": (debugconfig, [], _('debugconfig')), 2649 "debugconfig": (debugconfig, [], _('debugconfig')),
2623 "debugsetparents": (debugsetparents, [], _('debugsetparents REV1 [REV2]')), 2650 "debugsetparents": (debugsetparents, [], _('debugsetparents REV1 [REV2]')),
2624 "debugstate": (debugstate, [], _('debugstate')), 2651 "debugstate": (debugstate, [], _('debugstate')),
2633 _('debugwalk [OPTION]... [FILE]...')), 2660 _('debugwalk [OPTION]... [FILE]...')),
2634 "^diff": 2661 "^diff":
2635 (diff, 2662 (diff,
2636 [('r', 'rev', [], _('revision')), 2663 [('r', 'rev', [], _('revision')),
2637 ('a', 'text', None, _('treat all files as text')), 2664 ('a', 'text', None, _('treat all files as text')),
2638 ('I', 'include', [], _('include names matching the given patterns')),
2639 ('p', 'show-function', None, 2665 ('p', 'show-function', None,
2640 _('show which function each change is in')), 2666 _('show which function each change is in')),
2641 ('w', 'ignore-all-space', None, 2667 ('w', 'ignore-all-space', None,
2642 _('ignore white space when comparing lines')), 2668 _('ignore white space when comparing lines')),
2643 ('X', 'exclude', [], 2669 ('I', 'include', [], _('include names matching the given patterns')),
2644 _('exclude names matching the given patterns'))], 2670 ('X', 'exclude', [], _('exclude names matching the given patterns'))],
2645 _('hg diff [-a] [-I] [-X] [-r REV1 [-r REV2]] [FILE]...')), 2671 _('hg diff [-a] [-I] [-X] [-r REV1 [-r REV2]] [FILE]...')),
2646 "^export": 2672 "^export":
2647 (export, 2673 (export,
2648 [('o', 'output', '', _('print output to file with formatted name')), 2674 [('o', 'output', '', _('print output to file with formatted name')),
2649 ('a', 'text', None, _('treat all files as text')), 2675 ('a', 'text', None, _('treat all files as text')),
2650 ('', 'switch-parent', None, _('diff against the second parent'))], 2676 ('', 'switch-parent', None, _('diff against the second parent'))],
2651 _('hg export [-a] [-o OUTFILE] REV...')), 2677 _('hg export [-a] [-o OUTFILESPEC] REV...')),
2652 "forget": 2678 "forget":
2653 (forget, 2679 (forget,
2654 [('I', 'include', [], _('include names matching the given patterns')), 2680 [('I', 'include', [], _('include names matching the given patterns')),
2655 ('X', 'exclude', [], _('exclude names matching the given patterns'))], 2681 ('X', 'exclude', [], _('exclude names matching the given patterns'))],
2656 _('hg forget [OPTION]... FILE...')), 2682 _('hg forget [OPTION]... FILE...')),
2657 "grep": 2683 "grep":
2658 (grep, 2684 (grep,
2659 [('0', 'print0', None, _('end fields with NUL')), 2685 [('0', 'print0', None, _('end fields with NUL')),
2660 ('I', 'include', [], _('include names matching the given patterns')),
2661 ('X', 'exclude', [], _('exclude names matching the given patterns')),
2662 ('', 'all', None, _('print all revisions that match')), 2686 ('', 'all', None, _('print all revisions that match')),
2663 ('i', 'ignore-case', None, _('ignore case when matching')), 2687 ('i', 'ignore-case', None, _('ignore case when matching')),
2664 ('l', 'files-with-matches', None, 2688 ('l', 'files-with-matches', None,
2665 _('print only filenames and revs that match')), 2689 _('print only filenames and revs that match')),
2666 ('n', 'line-number', None, _('print matching line numbers')), 2690 ('n', 'line-number', None, _('print matching line numbers')),
2667 ('r', 'rev', [], _('search in given revision range')), 2691 ('r', 'rev', [], _('search in given revision range')),
2668 ('u', 'user', None, _('print user who committed change'))], 2692 ('u', 'user', None, _('print user who committed change')),
2693 ('I', 'include', [], _('include names matching the given patterns')),
2694 ('X', 'exclude', [], _('exclude names matching the given patterns'))],
2669 _('hg grep [OPTION]... PATTERN [FILE]...')), 2695 _('hg grep [OPTION]... PATTERN [FILE]...')),
2670 "heads": 2696 "heads":
2671 (heads, 2697 (heads,
2672 [('b', 'branches', None, _('show branches')), 2698 [('b', 'branches', None, _('show branches')),
2673 ('', 'style', '', _('display using template map file')), 2699 ('', 'style', '', _('display using template map file')),
2679 "import|patch": 2705 "import|patch":
2680 (import_, 2706 (import_,
2681 [('p', 'strip', 1, 2707 [('p', 'strip', 1,
2682 _('directory strip option for patch. This has the same\n') + 2708 _('directory strip option for patch. This has the same\n') +
2683 _('meaning as the corresponding patch option')), 2709 _('meaning as the corresponding patch option')),
2710 ('b', 'base', '', _('base path')),
2684 ('f', 'force', None, 2711 ('f', 'force', None,
2685 _('skip check for outstanding uncommitted changes')), 2712 _('skip check for outstanding uncommitted changes'))],
2686 ('b', 'base', '', _('base path'))], 2713 _('hg import [-p NUM] [-b BASE] [-f] PATCH...')),
2687 _('hg import [-f] [-p NUM] [-b BASE] PATCH...')),
2688 "incoming|in": (incoming, 2714 "incoming|in": (incoming,
2689 [('M', 'no-merges', None, _('do not show merges')), 2715 [('M', 'no-merges', None, _('do not show merges')),
2690 ('', 'style', '', _('display using template map file')), 2716 ('', 'style', '', _('display using template map file')),
2691 ('n', 'newest-first', None, _('show newest record first')), 2717 ('n', 'newest-first', None, _('show newest record first')),
2692 ('p', 'patch', None, _('show patch')), 2718 ('p', 'patch', None, _('show patch')),
2703 ('I', 'include', [], _('include names matching the given patterns')), 2729 ('I', 'include', [], _('include names matching the given patterns')),
2704 ('X', 'exclude', [], _('exclude names matching the given patterns'))], 2730 ('X', 'exclude', [], _('exclude names matching the given patterns'))],
2705 _('hg locate [OPTION]... [PATTERN]...')), 2731 _('hg locate [OPTION]... [PATTERN]...')),
2706 "^log|history": 2732 "^log|history":
2707 (log, 2733 (log,
2708 [('I', 'include', [], _('include names matching the given patterns')), 2734 [('b', 'branches', None, _('show branches')),
2709 ('X', 'exclude', [], _('exclude names matching the given patterns')),
2710 ('b', 'branches', None, _('show branches')),
2711 ('k', 'keyword', [], _('search for a keyword')), 2735 ('k', 'keyword', [], _('search for a keyword')),
2712 ('l', 'limit', '', _('limit number of changes displayed')), 2736 ('l', 'limit', '', _('limit number of changes displayed')),
2713 ('r', 'rev', [], _('show the specified revision or range')), 2737 ('r', 'rev', [], _('show the specified revision or range')),
2714 ('M', 'no-merges', None, _('do not show merges')), 2738 ('M', 'no-merges', None, _('do not show merges')),
2715 ('', 'style', '', _('display using template map file')), 2739 ('', 'style', '', _('display using template map file')),
2716 ('m', 'only-merges', None, _('show only merges')), 2740 ('m', 'only-merges', None, _('show only merges')),
2717 ('p', 'patch', None, _('show patch')), 2741 ('p', 'patch', None, _('show patch')),
2718 ('', 'template', '', _('display with template'))], 2742 ('', 'template', '', _('display with template')),
2719 _('hg log [-I] [-X] [-r REV]... [-p] [FILE]')), 2743 ('I', 'include', [], _('include names matching the given patterns')),
2744 ('X', 'exclude', [], _('exclude names matching the given patterns'))],
2745 _('hg log [OPTION]... [FILE]')),
2720 "manifest": (manifest, [], _('hg manifest [REV]')), 2746 "manifest": (manifest, [], _('hg manifest [REV]')),
2721 "outgoing|out": (outgoing, 2747 "outgoing|out": (outgoing,
2722 [('M', 'no-merges', None, _('do not show merges')), 2748 [('M', 'no-merges', None, _('do not show merges')),
2723 ('p', 'patch', None, _('show patch')), 2749 ('p', 'patch', None, _('show patch')),
2724 ('', 'style', '', _('display using template map file')), 2750 ('', 'style', '', _('display using template map file')),
2725 ('n', 'newest-first', None, _('show newest record first')), 2751 ('n', 'newest-first', None, _('show newest record first')),
2726 ('', 'template', '', _('display with template'))], 2752 ('', 'template', '', _('display with template'))],
2727 _('hg outgoing [-p] [-n] [-M] [DEST]')), 2753 _('hg outgoing [-M] [-p] [-n] [DEST]')),
2728 "^parents": 2754 "^parents":
2729 (parents, 2755 (parents,
2730 [('b', 'branches', None, _('show branches')), 2756 [('b', 'branches', None, _('show branches')),
2731 ('', 'style', '', _('display using template map file')), 2757 ('', 'style', '', _('display using template map file')),
2732 ('', 'template', '', _('display with template'))], 2758 ('', 'template', '', _('display with template'))],
2738 _('update the working directory to tip after pull')), 2764 _('update the working directory to tip after pull')),
2739 ('e', 'ssh', '', _('specify ssh command to use')), 2765 ('e', 'ssh', '', _('specify ssh command to use')),
2740 ('r', 'rev', [], _('a specific revision you would like to pull')), 2766 ('r', 'rev', [], _('a specific revision you would like to pull')),
2741 ('', 'remotecmd', '', 2767 ('', 'remotecmd', '',
2742 _('specify hg command to run on the remote side'))], 2768 _('specify hg command to run on the remote side'))],
2743 _('hg pull [-u] [-e FILE] [-r rev]... [--remotecmd FILE] [SOURCE]')), 2769 _('hg pull [-u] [-e FILE] [-r REV]... [--remotecmd FILE] [SOURCE]')),
2744 "^push": 2770 "^push":
2745 (push, 2771 (push,
2746 [('f', 'force', None, _('force push')), 2772 [('f', 'force', None, _('force push')),
2747 ('e', 'ssh', '', _('specify ssh command to use')), 2773 ('e', 'ssh', '', _('specify ssh command to use')),
2748 ('r', 'rev', [], _('a specific revision you would like to push')), 2774 ('r', 'rev', [], _('a specific revision you would like to push')),
2749 ('', 'remotecmd', '', 2775 ('', 'remotecmd', '',
2750 _('specify hg command to run on the remote side'))], 2776 _('specify hg command to run on the remote side'))],
2751 _('hg push [-f] [-e FILE] [-r rev]... [--remotecmd FILE] [DEST]')), 2777 _('hg push [-f] [-e FILE] [-r REV]... [--remotecmd FILE] [DEST]')),
2752 "rawcommit": 2778 "debugrawcommit|rawcommit":
2753 (rawcommit, 2779 (rawcommit,
2754 [('p', 'parent', [], _('parent')), 2780 [('p', 'parent', [], _('parent')),
2755 ('d', 'date', '', _('date code')), 2781 ('d', 'date', '', _('date code')),
2756 ('u', 'user', '', _('user')), 2782 ('u', 'user', '', _('user')),
2757 ('F', 'files', '', _('file list')), 2783 ('F', 'files', '', _('file list')),
2758 ('m', 'message', '', _('commit message')), 2784 ('m', 'message', '', _('commit message')),
2759 ('l', 'logfile', '', _('commit message file'))], 2785 ('l', 'logfile', '', _('commit message file'))],
2760 _('hg rawcommit [OPTION]... [FILE]...')), 2786 _('hg debugrawcommit [OPTION]... [FILE]...')),
2761 "recover": (recover, [], _('hg recover')), 2787 "recover": (recover, [], _('hg recover')),
2762 "^remove|rm": 2788 "^remove|rm":
2763 (remove, 2789 (remove,
2764 [('I', 'include', [], _('include names matching the given patterns')), 2790 [('f', 'force', None, _('remove file even if modified')),
2791 ('I', 'include', [], _('include names matching the given patterns')),
2765 ('X', 'exclude', [], _('exclude names matching the given patterns'))], 2792 ('X', 'exclude', [], _('exclude names matching the given patterns'))],
2766 _('hg remove [OPTION]... FILE...')), 2793 _('hg remove [OPTION]... FILE...')),
2767 "rename|mv": 2794 "rename|mv":
2768 (rename, 2795 (rename,
2769 [('I', 'include', [], _('include names matching the given patterns')), 2796 [('A', 'after', None, _('record a rename that has already occurred')),
2770 ('X', 'exclude', [], _('exclude names matching the given patterns')),
2771 ('A', 'after', None, _('record a rename that has already occurred')),
2772 ('f', 'force', None, 2797 ('f', 'force', None,
2773 _('forcibly copy over an existing managed file'))], 2798 _('forcibly copy over an existing managed file')),
2774 _('hg rename [OPTION]... [SOURCE]... DEST')), 2799 ('I', 'include', [], _('include names matching the given patterns')),
2800 ('X', 'exclude', [], _('exclude names matching the given patterns'))],
2801 _('hg rename [OPTION]... SOURCE... DEST')),
2775 "^revert": 2802 "^revert":
2776 (revert, 2803 (revert,
2777 [('I', 'include', [], _('include names matching the given patterns')), 2804 [('r', 'rev', '', _('revision to revert to')),
2778 ('X', 'exclude', [], _('exclude names matching the given patterns')), 2805 ('I', 'include', [], _('include names matching the given patterns')),
2779 ('r', 'rev', '', _('revision to revert to'))], 2806 ('X', 'exclude', [], _('exclude names matching the given patterns'))],
2780 _('hg revert [-n] [-r REV] [NAME]...')), 2807 _('hg revert [-r REV] [NAME]...')),
2781 "root": (root, [], _('hg root')), 2808 "root": (root, [], _('hg root')),
2782 "^serve": 2809 "^serve":
2783 (serve, 2810 (serve,
2784 [('A', 'accesslog', '', _('name of access log file to write to')), 2811 [('A', 'accesslog', '', _('name of access log file to write to')),
2785 ('d', 'daemon', None, _('run server in background')), 2812 ('d', 'daemon', None, _('run server in background')),
2789 ('a', 'address', '', _('address to use')), 2816 ('a', 'address', '', _('address to use')),
2790 ('n', 'name', '', 2817 ('n', 'name', '',
2791 _('name to show in web pages (default: working dir)')), 2818 _('name to show in web pages (default: working dir)')),
2792 ('', 'pid-file', '', _('name of file to write process ID to')), 2819 ('', 'pid-file', '', _('name of file to write process ID to')),
2793 ('', 'stdio', None, _('for remote clients')), 2820 ('', 'stdio', None, _('for remote clients')),
2794 ('', 'templates', '', _('web templates to use')), 2821 ('t', 'templates', '', _('web templates to use')),
2795 ('', 'style', '', _('template style to use')), 2822 ('', 'style', '', _('template style to use')),
2796 ('6', 'ipv6', None, _('use IPv6 in addition to IPv4'))], 2823 ('6', 'ipv6', None, _('use IPv6 in addition to IPv4'))],
2797 _('hg serve [OPTION]...')), 2824 _('hg serve [OPTION]...')),
2798 "^status|st": 2825 "^status|st":
2799 (status, 2826 (status,
2813 [('l', 'local', None, _('make the tag local')), 2840 [('l', 'local', None, _('make the tag local')),
2814 ('m', 'message', '', _('message for tag commit log entry')), 2841 ('m', 'message', '', _('message for tag commit log entry')),
2815 ('d', 'date', '', _('record datecode as commit date')), 2842 ('d', 'date', '', _('record datecode as commit date')),
2816 ('u', 'user', '', _('record user as commiter')), 2843 ('u', 'user', '', _('record user as commiter')),
2817 ('r', 'rev', '', _('revision to tag'))], 2844 ('r', 'rev', '', _('revision to tag'))],
2818 _('hg tag [-r REV] [OPTION]... NAME')), 2845 _('hg tag [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME')),
2819 "tags": (tags, [], _('hg tags')), 2846 "tags": (tags, [], _('hg tags')),
2820 "tip": 2847 "tip":
2821 (tip, 2848 (tip,
2822 [('b', 'branches', None, _('show branches')), 2849 [('b', 'branches', None, _('show branches')),
2823 ('', 'style', '', _('display using template map file')), 2850 ('', 'style', '', _('display using template map file')),
2824 ('p', 'patch', None, _('show patch')), 2851 ('p', 'patch', None, _('show patch')),
2825 ('', 'template', '', _('display with template'))], 2852 ('', 'template', '', _('display with template'))],
2826 _('hg [-b] [-p] tip')), 2853 _('hg tip [-b] [-p]')),
2827 "unbundle": 2854 "unbundle":
2828 (unbundle, 2855 (unbundle,
2829 [('u', 'update', None, 2856 [('u', 'update', None,
2830 _('update the working directory to tip after unbundle'))], 2857 _('update the working directory to tip after unbundle'))],
2831 _('hg unbundle [-u] FILE')), 2858 _('hg unbundle [-u] FILE')),
2842 "verify": (verify, [], _('hg verify')), 2869 "verify": (verify, [], _('hg verify')),
2843 "version": (show_version, [], _('hg version')), 2870 "version": (show_version, [], _('hg version')),
2844 } 2871 }
2845 2872
2846 globalopts = [ 2873 globalopts = [
2847 ('R', 'repository', '', _('repository root directory')), 2874 ('R', 'repository', '',
2875 _('repository root directory or symbolic path name')),
2848 ('', 'cwd', '', _('change working directory')), 2876 ('', 'cwd', '', _('change working directory')),
2849 ('y', 'noninteractive', None, 2877 ('y', 'noninteractive', None,
2850 _('do not prompt, assume \'yes\' for any required answers')), 2878 _('do not prompt, assume \'yes\' for any required answers')),
2851 ('q', 'quiet', None, _('suppress output')), 2879 ('q', 'quiet', None, _('suppress output')),
2852 ('v', 'verbose', None, _('enable additional output')), 2880 ('v', 'verbose', None, _('enable additional output')),
2857 ('', 'profile', None, _('print command execution profile')), 2885 ('', 'profile', None, _('print command execution profile')),
2858 ('', 'version', None, _('output version information and exit')), 2886 ('', 'version', None, _('output version information and exit')),
2859 ('h', 'help', None, _('display help and exit')), 2887 ('h', 'help', None, _('display help and exit')),
2860 ] 2888 ]
2861 2889
2862 norepo = ("clone init version help debugancestor debugconfig debugdata" 2890 norepo = ("clone init version help debugancestor debugcomplete debugdata"
2863 " debugindex debugindexdot paths") 2891 " debugindex debugindexdot")
2864 2892 optionalrepo = ("paths debugconfig")
2865 def find(cmd): 2893
2866 """Return (aliases, command table entry) for command string.""" 2894 def findpossible(cmd):
2867 choice = None 2895 """
2868 count = 0 2896 Return cmd -> (aliases, command table entry)
2897 for each matching command
2898 """
2899 choice = {}
2900 debugchoice = {}
2869 for e in table.keys(): 2901 for e in table.keys():
2870 aliases = e.lstrip("^").split("|") 2902 aliases = e.lstrip("^").split("|")
2871 if cmd in aliases: 2903 if cmd in aliases:
2872 return aliases, table[e] 2904 choice[cmd] = (aliases, table[e])
2905 continue
2873 for a in aliases: 2906 for a in aliases:
2874 if a.startswith(cmd): 2907 if a.startswith(cmd):
2875 count += 1 2908 if aliases[0].startswith("debug"):
2876 choice = aliases, table[e] 2909 debugchoice[a] = (aliases, table[e])
2910 else:
2911 choice[a] = (aliases, table[e])
2877 break 2912 break
2878 2913
2879 if count > 1: 2914 if not choice and debugchoice:
2880 raise AmbiguousCommand(cmd) 2915 choice = debugchoice
2916
2917 return choice
2918
2919 def find(cmd):
2920 """Return (aliases, command table entry) for command string."""
2921 choice = findpossible(cmd)
2922
2923 if choice.has_key(cmd):
2924 return choice[cmd]
2925
2926 if len(choice) > 1:
2927 clist = choice.keys()
2928 clist.sort()
2929 raise AmbiguousCommand(cmd, clist)
2881 2930
2882 if choice: 2931 if choice:
2883 return choice 2932 return choice.values()[0]
2884 2933
2885 raise UnknownCommand(cmd) 2934 raise UnknownCommand(cmd)
2886 2935
2887 class SignalInterrupt(Exception): 2936 class SignalInterrupt(Exception):
2888 """Exception raised on SIGTERM and SIGHUP.""" 2937 """Exception raised on SIGTERM and SIGHUP."""
2966 components = name.split('.') 3015 components = name.split('.')
2967 for comp in components[1:]: 3016 for comp in components[1:]:
2968 mod = getattr(mod, comp) 3017 mod = getattr(mod, comp)
2969 return mod 3018 return mod
2970 try: 3019 try:
2971 mod = importh(x[0]) 3020 try:
3021 mod = importh("hgext." + x[0])
3022 except ImportError:
3023 mod = importh(x[0])
2972 except Exception, inst: 3024 except Exception, inst:
2973 on_exception(Exception, inst) 3025 on_exception(Exception, inst)
2974 continue 3026 continue
2975 3027
2976 external.append(mod) 3028 external.append(mod)
2981 u.warn(_("module %s overrides %s\n") % (x.__name__, t)) 3033 u.warn(_("module %s overrides %s\n") % (x.__name__, t))
2982 table.update(cmdtable) 3034 table.update(cmdtable)
2983 3035
2984 try: 3036 try:
2985 cmd, func, args, options, cmdoptions = parse(u, args) 3037 cmd, func, args, options, cmdoptions = parse(u, args)
3038 if options["time"]:
3039 def get_times():
3040 t = os.times()
3041 if t[4] == 0.0: # Windows leaves this as zero, so use time.clock()
3042 t = (t[0], t[1], t[2], t[3], time.clock())
3043 return t
3044 s = get_times()
3045 def print_time():
3046 t = get_times()
3047 u.warn(_("Time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n") %
3048 (t[4]-s[4], t[0]-s[0], t[2]-s[2], t[1]-s[1], t[3]-s[3]))
3049 atexit.register(print_time)
3050
3051 u.updateopts(options["verbose"], options["debug"], options["quiet"],
3052 not options["noninteractive"])
3053
3054 # enter the debugger before command execution
3055 if options['debugger']:
3056 pdb.set_trace()
3057
3058 try:
3059 if options['cwd']:
3060 try:
3061 os.chdir(options['cwd'])
3062 except OSError, inst:
3063 raise util.Abort('%s: %s' %
3064 (options['cwd'], inst.strerror))
3065
3066 path = u.expandpath(options["repository"]) or ""
3067 repo = path and hg.repository(u, path=path) or None
3068
3069 if options['help']:
3070 help_(u, cmd, options['version'])
3071 sys.exit(0)
3072 elif options['version']:
3073 show_version(u)
3074 sys.exit(0)
3075 elif not cmd:
3076 help_(u, 'shortlist')
3077 sys.exit(0)
3078
3079 if cmd not in norepo.split():
3080 try:
3081 if not repo:
3082 repo = hg.repository(u, path=path)
3083 u = repo.ui
3084 for x in external:
3085 if hasattr(x, 'reposetup'):
3086 x.reposetup(u, repo)
3087 except hg.RepoError:
3088 if cmd not in optionalrepo.split():
3089 raise
3090 d = lambda: func(u, repo, *args, **cmdoptions)
3091 else:
3092 d = lambda: func(u, *args, **cmdoptions)
3093
3094 try:
3095 if options['profile']:
3096 import hotshot, hotshot.stats
3097 prof = hotshot.Profile("hg.prof")
3098 try:
3099 try:
3100 return prof.runcall(d)
3101 except:
3102 try:
3103 u.warn(_('exception raised - generating '
3104 'profile anyway\n'))
3105 except:
3106 pass
3107 raise
3108 finally:
3109 prof.close()
3110 stats = hotshot.stats.load("hg.prof")
3111 stats.strip_dirs()
3112 stats.sort_stats('time', 'calls')
3113 stats.print_stats(40)
3114 else:
3115 return d()
3116 finally:
3117 u.flush()
3118 except:
3119 # enter the debugger when we hit an exception
3120 if options['debugger']:
3121 pdb.post_mortem(sys.exc_info()[2])
3122 if options['traceback']:
3123 traceback.print_exc()
3124 raise
2986 except ParseError, inst: 3125 except ParseError, inst:
2987 if inst.args[0]: 3126 if inst.args[0]:
2988 u.warn(_("hg %s: %s\n") % (inst.args[0], inst.args[1])) 3127 u.warn(_("hg %s: %s\n") % (inst.args[0], inst.args[1]))
2989 help_(u, inst.args[0]) 3128 help_(u, inst.args[0])
2990 else: 3129 else:
2991 u.warn(_("hg: %s\n") % inst.args[1]) 3130 u.warn(_("hg: %s\n") % inst.args[1])
2992 help_(u, 'shortlist') 3131 help_(u, 'shortlist')
2993 sys.exit(-1) 3132 sys.exit(-1)
2994 except AmbiguousCommand, inst: 3133 except AmbiguousCommand, inst:
2995 u.warn(_("hg: command '%s' is ambiguous.\n") % inst.args[0]) 3134 u.warn(_("hg: command '%s' is ambiguous:\n %s\n") %
3135 (inst.args[0], " ".join(inst.args[1])))
2996 sys.exit(1) 3136 sys.exit(1)
2997 except UnknownCommand, inst: 3137 except UnknownCommand, inst:
2998 u.warn(_("hg: unknown command '%s'\n") % inst.args[0]) 3138 u.warn(_("hg: unknown command '%s'\n") % inst.args[0])
2999 help_(u, 'shortlist') 3139 help_(u, 'shortlist')
3000 sys.exit(1) 3140 sys.exit(1)
3001
3002 if options["time"]:
3003 def get_times():
3004 t = os.times()
3005 if t[4] == 0.0: # Windows leaves this as zero, so use time.clock()
3006 t = (t[0], t[1], t[2], t[3], time.clock())
3007 return t
3008 s = get_times()
3009 def print_time():
3010 t = get_times()
3011 u.warn(_("Time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n") %
3012 (t[4]-s[4], t[0]-s[0], t[2]-s[2], t[1]-s[1], t[3]-s[3]))
3013 atexit.register(print_time)
3014
3015 u.updateopts(options["verbose"], options["debug"], options["quiet"],
3016 not options["noninteractive"])
3017
3018 # enter the debugger before command execution
3019 if options['debugger']:
3020 pdb.set_trace()
3021
3022 try:
3023 try:
3024 if options['help']:
3025 help_(u, cmd, options['version'])
3026 sys.exit(0)
3027 elif options['version']:
3028 show_version(u)
3029 sys.exit(0)
3030 elif not cmd:
3031 help_(u, 'shortlist')
3032 sys.exit(0)
3033
3034 if options['cwd']:
3035 try:
3036 os.chdir(options['cwd'])
3037 except OSError, inst:
3038 raise util.Abort('%s: %s' %
3039 (options['cwd'], inst.strerror))
3040
3041 if cmd not in norepo.split():
3042 path = options["repository"] or ""
3043 repo = hg.repository(ui=u, path=path)
3044 for x in external:
3045 if hasattr(x, 'reposetup'):
3046 x.reposetup(u, repo)
3047 d = lambda: func(u, repo, *args, **cmdoptions)
3048 else:
3049 d = lambda: func(u, *args, **cmdoptions)
3050
3051 if options['profile']:
3052 import hotshot, hotshot.stats
3053 prof = hotshot.Profile("hg.prof")
3054 r = prof.runcall(d)
3055 prof.close()
3056 stats = hotshot.stats.load("hg.prof")
3057 stats.strip_dirs()
3058 stats.sort_stats('time', 'calls')
3059 stats.print_stats(40)
3060 return r
3061 else:
3062 return d()
3063 except:
3064 # enter the debugger when we hit an exception
3065 if options['debugger']:
3066 pdb.post_mortem(sys.exc_info()[2])
3067 if options['traceback']:
3068 traceback.print_exc()
3069 raise
3070 except hg.RepoError, inst: 3141 except hg.RepoError, inst:
3071 u.warn(_("abort: "), inst, "!\n") 3142 u.warn(_("abort: "), inst, "!\n")
3072 except revlog.RevlogError, inst: 3143 except revlog.RevlogError, inst:
3073 u.warn(_("abort: "), inst, "!\n") 3144 u.warn(_("abort: "), inst, "!\n")
3074 except SignalInterrupt: 3145 except SignalInterrupt:
3111 if len(tb) > 2: # no 3182 if len(tb) > 2: # no
3112 raise 3183 raise
3113 u.debug(inst, "\n") 3184 u.debug(inst, "\n")
3114 u.warn(_("%s: invalid arguments\n") % cmd) 3185 u.warn(_("%s: invalid arguments\n") % cmd)
3115 help_(u, cmd) 3186 help_(u, cmd)
3116 except AmbiguousCommand, inst:
3117 u.warn(_("hg: command '%s' is ambiguous.\n") % inst.args[0])
3118 help_(u, 'shortlist')
3119 except UnknownCommand, inst:
3120 u.warn(_("hg: unknown command '%s'\n") % inst.args[0])
3121 help_(u, 'shortlist')
3122 except SystemExit: 3187 except SystemExit:
3123 # don't catch this in the catch-all below 3188 # don't catch this in the catch-all below
3124 raise 3189 raise
3125 except: 3190 except:
3126 u.warn(_("** unknown exception encountered, details follow\n")) 3191 u.warn(_("** unknown exception encountered, details follow\n"))