1 import os, re |
1 import os, re, traceback, sys |
2 from mercurial import fancyopts, ui, hg |
2 from mercurial import fancyopts, ui, hg |
3 |
3 |
4 class UnknownCommand(Exception): pass |
4 class UnknownCommand(Exception): pass |
5 |
5 |
6 def relpath(repo, args): |
6 def relpath(repo, args): |
7 if os.getcwd() != repo.root: |
7 if os.getcwd() != repo.root: |
8 p = os.getcwd()[len(repo.root) + 1: ] |
8 p = os.getcwd()[len(repo.root) + 1: ] |
9 return [ os.path.join(p, x) for x in args ] |
9 return [ os.path.join(p, x) for x in args ] |
10 return args |
10 return args |
11 |
11 |
12 def help(ui, args): |
12 def help(ui, cmd=None): |
|
13 '''show help''' |
|
14 if cmd: |
|
15 try: |
|
16 i = find(cmd) |
|
17 ui.write("%s\n\n" % i[2]) |
|
18 ui.write(i[0].__doc__, "\n") |
|
19 except UnknownCommand: |
|
20 ui.warn("unknown command %s", cmd) |
|
21 sys.exit(0) |
|
22 |
13 ui.status("""\ |
23 ui.status("""\ |
14 hg commands: |
24 hg commands: |
15 |
25 |
16 add [files...] add the given files in the next commit |
26 add [files...] add the given files in the next commit |
17 addremove add all new files, delete all missing files |
27 addremove add all new files, delete all missing files |
33 status show new, missing, and changed files in working dir |
43 status show new, missing, and changed files in working dir |
34 tags show current changeset tags |
44 tags show current changeset tags |
35 undo undo the last transaction |
45 undo undo the last transaction |
36 """) |
46 """) |
37 |
47 |
38 def init(ui, args): |
48 def init(ui): |
39 """create a repository""" |
49 """create a repository""" |
40 hg.repository(ui, ".", create=1) |
50 hg.repository(ui, ".", create=1) |
41 |
51 |
42 def checkout(u, repo, args): |
52 def checkout(u, repo, changeset=None): |
|
53 '''checkout a given changeset or the current tip''' |
43 node = repo.changelog.tip() |
54 node = repo.changelog.tip() |
44 if args: |
55 if changeset: |
45 node = repo.lookup(args[0]) |
56 node = repo.lookup(changeset) |
46 repo.checkout(node) |
57 repo.checkout(node) |
47 |
58 |
48 def annotate(u, repo, args, **ops): |
59 def annotate(u, repo, *args, **ops): |
49 if not args: |
|
50 return |
|
51 |
|
52 def getnode(rev): |
60 def getnode(rev): |
53 return hg.short(repo.changelog.node(rev)) |
61 return hg.short(repo.changelog.node(rev)) |
54 |
62 |
55 def getname(rev): |
63 def getname(rev): |
56 try: |
64 try: |
88 pieces.append([ "%*s" % (m, x) for x in l]) |
96 pieces.append([ "%*s" % (m, x) for x in l]) |
89 |
97 |
90 for p,l in zip(zip(*pieces), lines): |
98 for p,l in zip(zip(*pieces), lines): |
91 u.write(" ".join(p) + ": " + l[1]) |
99 u.write(" ".join(p) + ": " + l[1]) |
92 |
100 |
93 def undo(ui, repo, args): |
101 def undo(ui, repo): |
94 repo.undo() |
102 repo.undo() |
95 |
103 |
96 table = { |
104 table = { |
97 "init": (init, [], 'hg init'), |
105 "init": (init, [], 'hg init'), |
98 "help": (help, [], 'hg help'), |
106 "help": (help, [], 'hg help [command]'), |
99 "checkout|co": (checkout, [], 'hg checkout'), |
107 "checkout|co": (checkout, [], 'hg checkout [changeset]'), |
100 "ann|annotate": (annotate, |
108 "ann|annotate": (annotate, |
101 [('r', 'revision', '', 'revision'), |
109 [('r', 'revision', '', 'revision'), |
102 ('u', 'user', None, 'show user'), |
110 ('u', 'user', None, 'show user'), |
103 ('n', 'number', None, 'show revision number'), |
111 ('n', 'number', None, 'show revision number'), |
104 ('c', 'changeset', None, 'show changeset')], |
112 ('c', 'changeset', None, 'show changeset')], |
105 'hg annotate [-u] [-c] [-n] [-r id] [files]'), |
113 'hg annotate [-u] [-c] [-n] [-r id] [files]'), |
106 "undo": (undo, [], 'hg undo'), |
114 "undo": (undo, [], 'hg undo'), |
107 } |
115 } |
108 |
116 |
109 norepo = "init branch help" |
117 norepo = "init branch help" |
|
118 |
|
119 def find(cmd): |
|
120 i = None |
|
121 for e in table.keys(): |
|
122 if re.match(e + "$", cmd): |
|
123 return table[e] |
|
124 |
|
125 raise UnknownCommand(cmd) |
110 |
126 |
111 def dispatch(args): |
127 def dispatch(args): |
112 options = {} |
128 options = {} |
113 opts = [('v', 'verbose', None, 'verbose'), |
129 opts = [('v', 'verbose', None, 'verbose'), |
114 ('d', 'debug', None, 'debug'), |
130 ('d', 'debug', None, 'debug'), |
125 cmd, args = args[0], args[1:] |
141 cmd, args = args[0], args[1:] |
126 |
142 |
127 u = ui.ui(options["verbose"], options["debug"], options["quiet"], |
143 u = ui.ui(options["verbose"], options["debug"], options["quiet"], |
128 not options["noninteractive"]) |
144 not options["noninteractive"]) |
129 |
145 |
130 i = None |
146 # deal with unfound commands later |
131 for e in table.keys(): |
147 i = find(cmd) |
132 if re.match(e + "$", cmd): |
|
133 i = table[e] |
|
134 |
|
135 # deal with this internally later |
|
136 if not i: raise UnknownCommand(cmd) |
|
137 |
148 |
138 cmdoptions = {} |
149 cmdoptions = {} |
139 args = fancyopts.fancyopts(args, i[1], cmdoptions, i[2]) |
150 args = fancyopts.fancyopts(args, i[1], cmdoptions, i[2]) |
140 |
151 |
141 if cmd not in norepo.split(): |
152 if cmd not in norepo.split(): |
142 repo = hg.repository(ui = u) |
153 repo = hg.repository(ui = u) |
143 d = lambda: i[0](u, repo, args, **cmdoptions) |
154 d = lambda: i[0](u, repo, *args, **cmdoptions) |
144 else: |
155 else: |
145 d = lambda: i[0](u, args, **cmdoptions) |
156 d = lambda: i[0](u, *args, **cmdoptions) |
146 |
157 |
147 try: |
158 try: |
148 d() |
159 d() |
149 except KeyboardInterrupt: |
160 except KeyboardInterrupt: |
150 u.warn("interrupted!\n") |
161 u.warn("interrupted!\n") |
|
162 except TypeError, inst: |
|
163 # was this an argument error? |
|
164 tb = traceback.extract_tb(sys.exc_info()[2]) |
|
165 if len(tb) > 2: # no |
|
166 raise |
|
167 u.warn("%s: invalid arguments\n" % i[0].__name__) |
|
168 u.warn("syntax: %s\n" % i[2]) |
|
169 sys.exit(-1) |