##// END OF EJS Templates
big heap of command clean-up work...
mpm@selenic.com -
r245:fef0f8e0 default
parent child Browse files
Show More
@@ -19,32 +19,6 b''
19 import sys, os, time
19 import sys, os, time
20 from mercurial import hg, mdiff, fancyopts, ui, commands
20 from mercurial import hg, mdiff, fancyopts, ui, commands
21
21
22 def help():
23 ui.status("""\
24 commands:
25
26 add [files...] add the given files in the next commit
27 addremove add all new files, delete all missing files
28 annotate [files...] show changeset number per file line
29 branch <path> create a branch of <path> in this directory
30 checkout [changeset] checkout the latest or given changeset
31 commit commit all changes to the repository
32 diff [files...] diff working directory (or selected files)
33 dump <file> [rev] dump the latest or given revision of a file
34 dumpmanifest [rev] dump the latest or given revision of the manifest
35 export <rev> dump the changeset header and diffs for a revision
36 history show changeset history
37 init create a new repository in this directory
38 log <file> show revision history of a single file
39 merge <path> merge changes from <path> into local repository
40 recover rollback an interrupted transaction
41 remove [files...] remove the given files in the next commit
42 serve export the repository via HTTP
43 status show new, missing, and changed files in working dir
44 tags show current changeset tags
45 undo undo the last transaction
46 """)
47
48 def filterfiles(list, files):
22 def filterfiles(list, files):
49 l = [ x for x in list if x in files ]
23 l = [ x for x in list if x in files ]
50
24
@@ -126,21 +100,6 b' relpath = None'
126 if os.getcwd() != repo.root:
100 if os.getcwd() != repo.root:
127 relpath = os.getcwd()[len(repo.root) + 1: ]
101 relpath = os.getcwd()[len(repo.root) + 1: ]
128
102
129 elif cmd == "add":
130 repo.add(args)
131
132 elif cmd == "forget":
133 repo.forget(args)
134
135 elif cmd == "remove" or cmd == "rm" or cmd == "del" or cmd == "delete":
136 repo.remove(args)
137
138 elif cmd == "commit" or cmd == "checkin" or cmd == "ci":
139 if 1:
140 if len(args) > 0:
141 repo.commit(args)
142 else:
143 repo.commit()
144 elif cmd == "rawcommit":
103 elif cmd == "rawcommit":
145 "raw commit interface"
104 "raw commit interface"
146 rc = {}
105 rc = {}
@@ -205,26 +164,6 b' elif cmd == "import" or cmd == "patch":'
205 raise "patch failed!"
164 raise "patch failed!"
206 repo.commit(files, text)
165 repo.commit(files, text)
207
166
208 elif cmd == "diff":
209 revs = []
210
211 if args:
212 doptions = {}
213 opts = [('r', 'revision', [], 'revision')]
214 args = fancyopts.fancyopts(args, opts, doptions,
215 'hg diff [options] [files]')
216 revs = map(lambda x: repo.lookup(x), doptions['revision'])
217
218 if len(revs) > 2:
219 self.ui.warn("too many revisions to diff\n")
220 sys.exit(1)
221
222 if relpath:
223 if not args: args = [ relpath ]
224 else: args = [ os.path.join(relpath, x) for x in args ]
225
226 diff(args, *revs)
227
228 elif cmd == "export":
167 elif cmd == "export":
229 node = repo.lookup(args[0])
168 node = repo.lookup(args[0])
230 prev, other = repo.changelog.parents(node)
169 prev, other = repo.changelog.parents(node)
@@ -249,11 +188,6 b' elif cmd == "debugaddchangegroup":'
249 data = sys.stdin.read()
188 data = sys.stdin.read()
250 repo.addchangegroup(data)
189 repo.addchangegroup(data)
251
190
252 elif cmd == "addremove":
253 (c, a, d, u) = repo.diffdir(repo.root)
254 repo.add(a)
255 repo.remove(d)
256
257 elif cmd == "history":
191 elif cmd == "history":
258 for i in range(repo.changelog.count()):
192 for i in range(repo.changelog.count()):
259 n = repo.changelog.node(i)
193 n = repo.changelog.node(i)
@@ -273,41 +207,6 b' elif cmd == "history":'
273 print "description:"
207 print "description:"
274 print changes[4]
208 print changes[4]
275
209
276 elif cmd == "tip":
277 n = repo.changelog.tip()
278 t = repo.changelog.rev(n)
279 ui.status("%d:%s\n" % (t, hg.hex(n)))
280
281 elif cmd == "log":
282
283 if len(args) == 1:
284 if relpath:
285 args[0] = os.path.join(relpath, args[0])
286
287 r = repo.file(args[0])
288 for i in range(r.count()):
289 n = r.node(i)
290 (p1, p2) = r.parents(n)
291 (h, h1, h2) = map(hg.hex, (n, p1, p2))
292 (i1, i2) = map(r.rev, (p1, p2))
293 cr = r.linkrev(n)
294 cn = hg.hex(repo.changelog.node(cr))
295 print "rev: %4d:%s" % (i, h)
296 print "changeset: %4d:%s" % (cr, cn)
297 print "parents: %4d:%s" % (i1, h1)
298 if i2: print " %4d:%s" % (i2, h2)
299 changes = repo.changelog.read(repo.changelog.node(cr))
300 print "user: %s" % changes[1]
301 print "date: %s" % time.asctime(
302 time.localtime(float(changes[2].split(' ')[0])))
303 print "description:"
304 print changes[4]
305 print
306 elif len(args) > 1:
307 print "too many args"
308 else:
309 print "missing filename"
310
311 elif cmd == "dump":
210 elif cmd == "dump":
312 if args:
211 if args:
313 r = repo.file(args[0])
212 r = repo.file(args[0])
@@ -384,9 +283,6 b' elif cmd == "tags":'
384 r = "?"
283 r = "?"
385 print "%-30s %5d:%s" % (k, repo.changelog.rev(n), hg.hex(n))
284 print "%-30s %5d:%s" % (k, repo.changelog.rev(n), hg.hex(n))
386
285
387 elif cmd == "recover":
388 repo.recover()
389
390 elif cmd == "verify":
286 elif cmd == "verify":
391 filelinkrevs = {}
287 filelinkrevs = {}
392 filenodes = {}
288 filenodes = {}
@@ -510,23 +406,6 b' elif cmd == "verify":'
510 ui.warn("%d integrity errors encountered!\n" % errors)
406 ui.warn("%d integrity errors encountered!\n" % errors)
511 sys.exit(1)
407 sys.exit(1)
512
408
513 elif cmd == "serve":
514 from mercurial import hgweb
515
516 soptions = {}
517 opts = [('p', 'port', 8000, 'listen port'),
518 ('a', 'address', '', 'interface address'),
519 ('n', 'name', os.getcwd(), 'repository name'),
520 ('t', 'templates', "", 'template map')
521 ]
522
523 args = fancyopts.fancyopts(args, opts, soptions,
524 'hg serve [options]')
525
526 hgweb.server(repo.root, soptions["name"], soptions["templates"],
527 soptions["address"], soptions["port"])
528
529 else:
409 else:
530 if cmd: ui.warn("unknown command\n\n")
410 if cmd: ui.warn("unknown command\n\n")
531 help()
532 sys.exit(1)
411 sys.exit(1)
@@ -1,27 +1,64 b''
1 import os, re, traceback, sys, signal, time
1 import os, re, traceback, sys, signal, time, mdiff
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 filterfiles(list, files):
6 def filterfiles(filters, files):
7 l = [ x for x in list if x in files ]
7 l = [ x for x in files if x in filters ]
8
8
9 for f in files:
9 for t in filters:
10 if f[-1] != os.sep: f += os.sep
10 if t and t[-1] != os.sep: t += os.sep
11 l += [ x for x in list if x.startswith(f) ]
11 l += [ x for x in files if x.startswith(t) ]
12 return l
12 return l
13
13
14 def relfilter(repo, args):
14 def relfilter(repo, files):
15 if os.getcwd() != repo.root:
15 if os.getcwd() != repo.root:
16 p = os.getcwd()[len(repo.root) + 1: ]
16 p = os.getcwd()[len(repo.root) + 1: ]
17 return filterfiles(p, args)
17 return filterfiles(p, files)
18 return args
18 return files
19
19
20 def relpath(repo, args):
20 def relpath(repo, args):
21 if os.getcwd() != repo.root:
21 if os.getcwd() != repo.root:
22 p = os.getcwd()[len(repo.root) + 1: ]
22 p = os.getcwd()[len(repo.root) + 1: ]
23 return [ os.path.join(p, x) for x in args ]
23 return [ os.path.normpath(os.path.join(p, x)) for x in args ]
24 return args
24 return args
25
26 def dodiff(repo, files = None, node1 = None, node2 = None):
27 def date(c):
28 return time.asctime(time.gmtime(float(c[2].split(' ')[0])))
29
30 if node2:
31 change = repo.changelog.read(node2)
32 mmap2 = repo.manifest.read(change[0])
33 (c, a, d) = repo.diffrevs(node1, node2)
34 def read(f): return repo.file(f).read(mmap2[f])
35 date2 = date(change)
36 else:
37 date2 = time.asctime()
38 (c, a, d, u) = repo.diffdir(repo.root, node1)
39 if not node1:
40 node1 = repo.dirstate.parents()[0]
41 def read(f): return file(os.path.join(repo.root, f)).read()
42
43 change = repo.changelog.read(node1)
44 mmap = repo.manifest.read(change[0])
45 date1 = date(change)
46
47 if files:
48 c, a, d = map(lambda x: filterfiles(files, x), (c, a, d))
49
50 for f in c:
51 to = repo.file(f).read(mmap[f])
52 tn = read(f)
53 sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f))
54 for f in a:
55 to = ""
56 tn = read(f)
57 sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f))
58 for f in d:
59 to = repo.file(f).read(mmap[f])
60 tn = ""
61 sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f))
25
62
26 def help(ui, cmd=None):
63 def help(ui, cmd=None):
27 '''show help'''
64 '''show help'''
@@ -59,28 +96,16 b' def help(ui, cmd=None):'
59 undo undo the last transaction
96 undo undo the last transaction
60 """)
97 """)
61
98
62 def init(ui):
99 def add(ui, repo, file, *files):
63 """create a repository"""
100 '''add the specified files on the next commit'''
64 hg.repository(ui, ".", create=1)
101 repo.add(relpath(repo, (file,) + files))
65
66 def branch(ui, path):
67 '''branch from a local repository'''
68 # this should eventually support remote repos
69 os.system("cp -al %s/.hg .hg" % path)
70
102
71 def checkout(ui, repo, changeset=None):
103 def addremove(ui, repo):
72 '''checkout a given changeset or the current tip'''
73 (c, a, d, u) = repo.diffdir(repo.root)
104 (c, a, d, u) = repo.diffdir(repo.root)
74 if c or a or d:
105 repo.add(a)
75 ui.warn("aborting (outstanding changes in working directory)\n")
106 repo.remove(d)
76 sys.exit(1)
77
107
78 node = repo.changelog.tip()
108 def annotate(u, repo, file, *files, **ops):
79 if changeset:
80 node = repo.lookup(changeset)
81 repo.checkout(node)
82
83 def annotate(u, repo, *args, **ops):
84 def getnode(rev):
109 def getnode(rev):
85 return hg.short(repo.changelog.node(rev))
110 return hg.short(repo.changelog.node(rev))
86
111
@@ -101,7 +126,6 b' def annotate(u, repo, *args, **ops):'
101 if not ops['user'] and not ops['changeset']:
126 if not ops['user'] and not ops['changeset']:
102 ops['number'] = 1
127 ops['number'] = 1
103
128
104 args = relpath(repo, args)
105 node = repo.dirstate.parents()[0]
129 node = repo.dirstate.parents()[0]
106 if ops['revision']:
130 if ops['revision']:
107 node = repo.changelog.lookup(ops['revision'])
131 node = repo.changelog.lookup(ops['revision'])
@@ -109,7 +133,7 b' def annotate(u, repo, *args, **ops):'
109 mmap = repo.manifest.read(change[0])
133 mmap = repo.manifest.read(change[0])
110 maxuserlen = 0
134 maxuserlen = 0
111 maxchangelen = 0
135 maxchangelen = 0
112 for f in args:
136 for f in relpath(repo, (file,) + files):
113 lines = repo.file(f).annotate(mmap[f])
137 lines = repo.file(f).annotate(mmap[f])
114 pieces = []
138 pieces = []
115
139
@@ -122,6 +146,47 b' def annotate(u, repo, *args, **ops):'
122 for p,l in zip(zip(*pieces), lines):
146 for p,l in zip(zip(*pieces), lines):
123 u.write(" ".join(p) + ": " + l[1])
147 u.write(" ".join(p) + ": " + l[1])
124
148
149 def branch(ui, path):
150 '''branch from a local repository'''
151 # this should eventually support remote repos
152 os.system("cp -al %s/.hg .hg" % path)
153
154 def checkout(ui, repo, changeset=None):
155 '''checkout a given changeset or the current tip'''
156 (c, a, d, u) = repo.diffdir(repo.root)
157 if c or a or d:
158 ui.warn("aborting (outstanding changes in working directory)\n")
159 sys.exit(1)
160
161 node = repo.changelog.tip()
162 if changeset:
163 node = repo.lookup(changeset)
164 repo.checkout(node)
165
166 def commit(ui, repo, *files):
167 """commit the specified files or all outstanding changes"""
168 repo.commit(relpath(repo, files))
169
170 def diff(ui, repo, *files, **opts):
171 revs = []
172 if opts['rev']:
173 revs = map(lambda x: repo.lookup(x), opts['rev'])
174
175 if len(revs) > 2:
176 self.ui.warn("too many revisions to diff\n")
177 sys.exit(1)
178
179 if files:
180 files = relpath(repo, files)
181 else:
182 files = relpath(repo, [""])
183
184 dodiff(repo, files, *revs)
185
186 def forget(ui, repo, file, *files):
187 """don't add the specified files on the next commit"""
188 repo.forget(relpath(repo, (file,) + files))
189
125 def heads(ui, repo):
190 def heads(ui, repo):
126 '''show current repository heads'''
191 '''show current repository heads'''
127 for n in repo.changelog.heads():
192 for n in repo.changelog.heads():
@@ -142,6 +207,33 b' def heads(ui, repo):'
142 print "description:"
207 print "description:"
143 print changes[4]
208 print changes[4]
144
209
210 def init(ui):
211 """create a repository"""
212 hg.repository(ui, ".", create=1)
213
214 def log(ui, repo, f):
215 f = relpath(repo, [f])[0]
216
217 r = repo.file(f)
218 for i in range(r.count()):
219 n = r.node(i)
220 (p1, p2) = r.parents(n)
221 (h, h1, h2) = map(hg.hex, (n, p1, p2))
222 (i1, i2) = map(r.rev, (p1, p2))
223 cr = r.linkrev(n)
224 cn = hg.hex(repo.changelog.node(cr))
225 print "rev: %4d:%s" % (i, h)
226 print "changeset: %4d:%s" % (cr, cn)
227 print "parents: %4d:%s" % (i1, h1)
228 if i2: print " %4d:%s" % (i2, h2)
229 changes = repo.changelog.read(repo.changelog.node(cr))
230 print "user: %s" % changes[1]
231 print "date: %s" % time.asctime(
232 time.localtime(float(changes[2].split(' ')[0])))
233 print "description:"
234 print changes[4].rstrip()
235 print
236
145 def parents(ui, repo, node = None):
237 def parents(ui, repo, node = None):
146 '''show the parents of the current working dir'''
238 '''show the parents of the current working dir'''
147 if node:
239 if node:
@@ -153,7 +245,14 b' def parents(ui, repo, node = None):'
153 if n != hg.nullid:
245 if n != hg.nullid:
154 ui.write("%d:%s\n" % (repo.changelog.rev(n), hg.hex(n)))
246 ui.write("%d:%s\n" % (repo.changelog.rev(n), hg.hex(n)))
155
247
156 def resolve(ui, repo, node = None):
248 def recover(ui, repo):
249 repo.recover()
250
251 def remove(ui, repo, file, *files):
252 """remove the specified files on the next commit"""
253 repo.remove(relpath(repo, (file,) + files))
254
255 def resolve(ui, repo, node=None):
157 '''merge a given node or the current tip into the working dir'''
256 '''merge a given node or the current tip into the working dir'''
158 if not node:
257 if not node:
159 node = repo.changelog.tip()
258 node = repo.changelog.tip()
@@ -161,13 +260,19 b' def resolve(ui, repo, node = None):'
161 node = repo.lookup(node)
260 node = repo.lookup(node)
162 repo.resolve(node)
261 repo.resolve(node)
163
262
263 def serve(ui, repo, **opts):
264 from mercurial import hgweb
265 hgweb.server(repo.root, opts["name"], opts["templates"],
266 opts["address"], opts["port"])
267
164 def status(ui, repo):
268 def status(ui, repo):
165 '''show changed files in the working directory
269 '''show changed files in the working directory
166
270
167 C = changed
271 C = changed
168 A = added
272 A = added
169 R = removed
273 R = removed
170 ? = not tracked'''
274 ? = not tracked'''
275
171 (c, a, d, u) = repo.diffdir(repo.root)
276 (c, a, d, u) = repo.diffdir(repo.root)
172 (c, a, d, u) = map(lambda x: relfilter(repo, x), (c, a, d, u))
277 (c, a, d, u) = map(lambda x: relfilter(repo, x), (c, a, d, u))
173
278
@@ -176,24 +281,44 b' R = removed'
176 for f in d: print "R", f
281 for f in d: print "R", f
177 for f in u: print "?", f
282 for f in u: print "?", f
178
283
284 def tip(ui, repo):
285 n = repo.changelog.tip()
286 t = repo.changelog.rev(n)
287 ui.status("%d:%s\n" % (t, hg.hex(n)))
288
179 def undo(ui, repo):
289 def undo(ui, repo):
180 repo.undo()
290 repo.undo()
181
291
182 table = {
292 table = {
183 "init": (init, [], 'hg init'),
293 "add": (add, [], "hg add [files]"),
184 "branch|clone": (branch, [], 'hg branch [path]'),
294 "addremove": (addremove, [], "hg addremove"),
185 "heads": (heads, [], 'hg heads'),
186 "help": (help, [], 'hg help [command]'),
187 "checkout|co": (checkout, [], 'hg checkout [changeset]'),
188 "ann|annotate": (annotate,
295 "ann|annotate": (annotate,
189 [('r', 'revision', '', 'revision'),
296 [('r', 'revision', '', 'revision'),
190 ('u', 'user', None, 'show user'),
297 ('u', 'user', None, 'show user'),
191 ('n', 'number', None, 'show revision number'),
298 ('n', 'number', None, 'show revision number'),
192 ('c', 'changeset', None, 'show changeset')],
299 ('c', 'changeset', None, 'show changeset')],
193 'hg annotate [-u] [-c] [-n] [-r id] [files]'),
300 'hg annotate [-u] [-c] [-n] [-r id] [files]'),
301 "branch|clone": (branch, [], 'hg branch [path]'),
302 "checkout|co": (checkout, [], 'hg checkout [changeset]'),
303 "commit|ci": (commit, [], 'hg commit [files]'),
304 "diff": (diff, [('r', 'rev', [], 'revision')],
305 'hg diff [-r A] [-r B] [files]'),
306 "forget": (forget, [], "hg forget [files]"),
307 "heads": (heads, [], 'hg heads'),
308 "help": (help, [], 'hg help [command]'),
309 "init": (init, [], 'hg init'),
310 "log": (log, [], 'hg log <file>'),
194 "parents": (parents, [], 'hg parents [node]'),
311 "parents": (parents, [], 'hg parents [node]'),
312 "recover": (recover, [], "hg recover"),
313 "remove": (remove, [], "hg remove [files]"),
195 "resolve": (resolve, [], 'hg resolve [node]'),
314 "resolve": (resolve, [], 'hg resolve [node]'),
315 "serve": (serve, [('p', 'port', 8000, 'listen port'),
316 ('a', 'address', '', 'interface address'),
317 ('n', 'name', os.getcwd(), 'repository name'),
318 ('t', 'templates', "", 'template map')],
319 "hg serve [options]"),
196 "status": (status, [], 'hg status'),
320 "status": (status, [], 'hg status'),
321 "tip": (tip, [], 'hg tip'),
197 "undo": (undo, [], 'hg undo'),
322 "undo": (undo, [], 'hg undo'),
198 }
323 }
199
324
General Comments 0
You need to be logged in to leave comments. Login now