##// END OF EJS Templates
Migrate rawcommit, import, export, history, and merge...
mpm@selenic.com -
r246:96cde50a default
parent child Browse files
Show More
@@ -16,55 +16,9 b''
16 # except:
16 # except:
17 # pass
17 # pass
18
18
19 import sys, os, time
19 import sys
20 from mercurial import hg, mdiff, fancyopts, ui, commands
20 from mercurial import hg, mdiff, fancyopts, ui, commands
21
21
22 def filterfiles(list, files):
23 l = [ x for x in list if x in files ]
24
25 for f in files:
26 if f[-1] != os.sep: f += os.sep
27 l += [ x for x in list if x.startswith(f) ]
28 return l
29
30 def diff(files = None, node1 = None, node2 = None):
31 def date(c):
32 return time.asctime(time.gmtime(float(c[2].split(' ')[0])))
33
34 if node2:
35 change = repo.changelog.read(node2)
36 mmap2 = repo.manifest.read(change[0])
37 (c, a, d) = repo.diffrevs(node1, node2)
38 def read(f): return repo.file(f).read(mmap2[f])
39 date2 = date(change)
40 else:
41 date2 = time.asctime()
42 if not node1:
43 node1 = repo.dirstate.parents()[0]
44 (c, a, d, u) = repo.diffdir(repo.root, node1)
45 def read(f): return file(os.path.join(repo.root, f)).read()
46
47 change = repo.changelog.read(node1)
48 mmap = repo.manifest.read(change[0])
49 date1 = date(change)
50
51 if files:
52 c, a, d = map(lambda x: filterfiles(x, files), (c, a, d))
53
54 for f in c:
55 to = repo.file(f).read(mmap[f])
56 tn = read(f)
57 sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f))
58 for f in a:
59 to = ""
60 tn = read(f)
61 sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f))
62 for f in d:
63 to = repo.file(f).read(mmap[f])
64 tn = ""
65 sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f))
66
67
68 try:
22 try:
69 sys.exit(commands.dispatch(sys.argv[1:]))
23 sys.exit(commands.dispatch(sys.argv[1:]))
70 except commands.UnknownCommand:
24 except commands.UnknownCommand:
@@ -96,90 +50,7 b' except IOError:'
96 ui.warn("Unable to open repository\n")
50 ui.warn("Unable to open repository\n")
97 sys.exit(0)
51 sys.exit(0)
98
52
99 relpath = None
53 if cmd == "debugchangegroup":
100 if os.getcwd() != repo.root:
101 relpath = os.getcwd()[len(repo.root) + 1: ]
102
103 elif cmd == "rawcommit":
104 "raw commit interface"
105 rc = {}
106 opts = [('p', 'parent', [], 'parent'),
107 ('d', 'date', "", 'data'),
108 ('u', 'user', "", 'user'),
109 ('F', 'files', "", 'file list'),
110 ('t', 'text', "", 'commit text'),
111 ('l', 'logfile', "", 'commit text file')
112 ]
113 args = fancyopts.fancyopts(args, opts, rc,
114 "hg rawcommit [options] files")
115 text = rc['text']
116 if not text and rc['logfile']:
117 try: text = open(rc['logfile']).read()
118 except IOError: pass
119 if not text and not rc['logfile']:
120 print "missing commit text"
121 sys.exit(0)
122 if rc['files']:
123 files = open(rc['files']).read().splitlines()
124 else:
125 files = args
126
127 repo.rawcommit(files, text, rc['user'], rc['date'], *rc['parent'])
128
129
130 elif cmd == "import" or cmd == "patch":
131 try:
132 import psyco
133 psyco.full()
134 except:
135 pass
136
137 ioptions = {}
138 opts = [('p', 'strip', 1, 'path strip'),
139 ('b', 'base', "", 'base path'),
140 ('q', 'quiet', "", 'silence diff')
141 ]
142
143 args = fancyopts.fancyopts(args, opts, ioptions,
144 'hg import [options] <patch names>')
145 d = ioptions["base"]
146 strip = ioptions["strip"]
147 quiet = ioptions["quiet"] and "> /dev/null" or ""
148
149 for patch in args:
150 ui.status("applying %s\n" % patch)
151 pf = os.path.join(d, patch)
152
153 text = ""
154 for l in file(pf):
155 if l[:4] == "--- ": break
156 text += l
157
158 f = os.popen("lsdiff --strip %d %s" % (strip, pf))
159 files = filter(None, map(lambda x: x.rstrip(), f.read().splitlines()))
160 f.close()
161
162 if files:
163 if os.system("patch -p%d < %s %s" % (strip, pf, quiet)):
164 raise "patch failed!"
165 repo.commit(files, text)
166
167 elif cmd == "export":
168 node = repo.lookup(args[0])
169 prev, other = repo.changelog.parents(node)
170 change = repo.changelog.read(node)
171 print "# HG changeset patch"
172 print "# User %s" % change[1]
173 print "# Node ID %s" % hg.hex(node)
174 print "# Parent %s" % hg.hex(prev)
175 print
176 if other != hg.nullid:
177 print "# Parent %s" % hg.hex(other)
178 print change[4]
179
180 diff(None, prev, node)
181
182 elif cmd == "debugchangegroup":
183 newer = repo.newer(map(repo.lookup, args))
54 newer = repo.newer(map(repo.lookup, args))
184 for chunk in repo.changegroup(newer):
55 for chunk in repo.changegroup(newer):
185 sys.stdout.write(chunk)
56 sys.stdout.write(chunk)
@@ -188,25 +59,6 b' elif cmd == "debugaddchangegroup":'
188 data = sys.stdin.read()
59 data = sys.stdin.read()
189 repo.addchangegroup(data)
60 repo.addchangegroup(data)
190
61
191 elif cmd == "history":
192 for i in range(repo.changelog.count()):
193 n = repo.changelog.node(i)
194 changes = repo.changelog.read(n)
195 (p1, p2) = repo.changelog.parents(n)
196 (h, h1, h2) = map(hg.hex, (n, p1, p2))
197 (i1, i2) = map(repo.changelog.rev, (p1, p2))
198 print "rev: %4d:%s" % (i, h)
199 print "parents: %4d:%s" % (i1, h1)
200 if i2: print " %4d:%s" % (i2, h2)
201 print "manifest: %4d:%s" % (repo.manifest.rev(changes[0]),
202 hg.hex(changes[0]))
203 print "user:", changes[1]
204 print "date:", time.asctime(
205 time.localtime(float(changes[2].split(' ')[0])))
206 if ui.verbose: print "files:", " ".join(changes[3])
207 print "description:"
208 print changes[4]
209
210 elif cmd == "dump":
62 elif cmd == "dump":
211 if args:
63 if args:
212 r = repo.file(args[0])
64 r = repo.file(args[0])
@@ -253,25 +105,6 b' elif cmd == "debugindexdot":'
253 print "\t%d -> %d" % (r.rev(e[5]), i)
105 print "\t%d -> %d" % (r.rev(e[5]), i)
254 print "}"
106 print "}"
255
107
256 elif cmd == "merge":
257 if args:
258 paths = {}
259 try:
260 pf = os.path.join(os.environ["HOME"], ".hgpaths")
261 for l in file(pf):
262 name, path = l.split()
263 paths[name] = path
264 except:
265 pass
266
267 if args[0] in paths: args[0] = paths[args[0]]
268
269 other = hg.repository(ui, args[0])
270 cg = repo.getchangegroup(other)
271 repo.addchangegroup(cg)
272 else:
273 print "missing source repository"
274
275 elif cmd == "tags":
108 elif cmd == "tags":
276 repo.lookup(0) # prime the cache
109 repo.lookup(0) # prime the cache
277 i = repo.tags.items()
110 i = repo.tags.items()
@@ -183,6 +183,22 b' def diff(ui, repo, *files, **opts):'
183
183
184 dodiff(repo, files, *revs)
184 dodiff(repo, files, *revs)
185
185
186 def export(ui, repo, changeset):
187 node = repo.lookup(changeset)
188 prev, other = repo.changelog.parents(node)
189 change = repo.changelog.read(node)
190 print "# HG changeset patch"
191 print "# User %s" % change[1]
192 print "# Node ID %s" % hg.hex(node)
193 print "# Parent %s" % hg.hex(prev)
194 print
195 if other != hg.nullid:
196 print "# Parent %s" % hg.hex(other)
197 print change[4].rstrip()
198 print
199
200 dodiff(repo, None, prev, node)
201
186 def forget(ui, repo, file, *files):
202 def forget(ui, repo, file, *files):
187 """don't add the specified files on the next commit"""
203 """don't add the specified files on the next commit"""
188 repo.forget(relpath(repo, (file,) + files))
204 repo.forget(relpath(repo, (file,) + files))
@@ -207,6 +223,56 b' def heads(ui, repo):'
207 print "description:"
223 print "description:"
208 print changes[4]
224 print changes[4]
209
225
226 def history(ui, repo):
227 """show the changelog history"""
228 for i in range(repo.changelog.count()):
229 n = repo.changelog.node(i)
230 changes = repo.changelog.read(n)
231 (p1, p2) = repo.changelog.parents(n)
232 (h, h1, h2) = map(hg.hex, (n, p1, p2))
233 (i1, i2) = map(repo.changelog.rev, (p1, p2))
234 print "rev: %4d:%s" % (i, h)
235 print "parents: %4d:%s" % (i1, h1)
236 if i2: print " %4d:%s" % (i2, h2)
237 print "manifest: %4d:%s" % (repo.manifest.rev(changes[0]),
238 hg.hex(changes[0]))
239 print "user:", changes[1]
240 print "date:", time.asctime(
241 time.localtime(float(changes[2].split(' ')[0])))
242 if ui.verbose: print "files:", " ".join(changes[3])
243 print "description:"
244 print changes[4]
245
246 def patch(ui, repo, patches, opts):
247 """import an ordered set of patches"""
248 try:
249 import psyco
250 psyco.full()
251 except:
252 pass
253
254 d = opts["base"]
255 strip = opts["strip"]
256 quiet = opts["quiet"] and "> /dev/null" or ""
257
258 for patch in patches:
259 ui.status("applying %s\n" % patch)
260 pf = os.path.join(d, patch)
261
262 text = ""
263 for l in file(pf):
264 if l[:4] == "--- ": break
265 text += l
266
267 f = os.popen("lsdiff --strip %d %s" % (strip, pf))
268 files = filter(None, map(lambda x: x.rstrip(), f.read().splitlines()))
269 f.close()
270
271 if files:
272 if os.system("patch -p%d < %s %s" % (strip, pf, quiet)):
273 raise "patch failed!"
274 repo.commit(files, text)
275
210 def init(ui):
276 def init(ui):
211 """create a repository"""
277 """create a repository"""
212 hg.repository(ui, ".", create=1)
278 hg.repository(ui, ".", create=1)
@@ -245,6 +311,40 b' def parents(ui, repo, node = None):'
245 if n != hg.nullid:
311 if n != hg.nullid:
246 ui.write("%d:%s\n" % (repo.changelog.rev(n), hg.hex(n)))
312 ui.write("%d:%s\n" % (repo.changelog.rev(n), hg.hex(n)))
247
313
314 def pull(ui, repo, source):
315 """pull changes from the specified source"""
316 paths = {}
317 try:
318 pf = os.path.expanduser("~/.hgpaths")
319 for l in file(pf):
320 name, path = l.split()
321 paths[name] = path
322 except IOError:
323 pass
324
325 if source in paths: source = paths[source]
326
327 other = hg.repository(ui, source)
328 cg = repo.getchangegroup(other)
329 repo.addchangegroup(cg)
330
331 def rawcommit(ui, repo, files, rc):
332 "raw commit interface"
333
334 text = rc['text']
335 if not text and rc['logfile']:
336 try: text = open(rc['logfile']).read()
337 except IOError: pass
338 if not text and not rc['logfile']:
339 print "missing commit text"
340 return 1
341
342 files = relpath(repo, files)
343 if rc['files']:
344 files += open(rc['files']).read().splitlines()
345
346 repo.rawcommit(files, text, rc['user'], rc['date'], *rc['parent'])
347
248 def recover(ui, repo):
348 def recover(ui, repo):
249 repo.recover()
349 repo.recover()
250
350
@@ -303,12 +403,28 b' table = {'
303 "commit|ci": (commit, [], 'hg commit [files]'),
403 "commit|ci": (commit, [], 'hg commit [files]'),
304 "diff": (diff, [('r', 'rev', [], 'revision')],
404 "diff": (diff, [('r', 'rev', [], 'revision')],
305 'hg diff [-r A] [-r B] [files]'),
405 'hg diff [-r A] [-r B] [files]'),
406 "export": (export, [], "hg export <changeset>"),
306 "forget": (forget, [], "hg forget [files]"),
407 "forget": (forget, [], "hg forget [files]"),
307 "heads": (heads, [], 'hg heads'),
408 "heads": (heads, [], 'hg heads'),
409 "history": (history, [], 'hg history'),
308 "help": (help, [], 'hg help [command]'),
410 "help": (help, [], 'hg help [command]'),
309 "init": (init, [], 'hg init'),
411 "init": (init, [], 'hg init'),
310 "log": (log, [], 'hg log <file>'),
412 "log": (log, [], 'hg log <file>'),
311 "parents": (parents, [], 'hg parents [node]'),
413 "parents": (parents, [], 'hg parents [node]'),
414 "patch|import": (patch,
415 [('p', 'strip', 1, 'path strip'),
416 ('b', 'base', "", 'base path'),
417 ('q', 'quiet', "", 'silence diff')],
418 "hg import [options] patches"),
419 "pull|merge": (pull, [], 'hg pull [source]'),
420 "rawcommit": (rawcommit,
421 [('p', 'parent', [], 'parent'),
422 ('d', 'date', "", 'data'),
423 ('u', 'user', "", 'user'),
424 ('F', 'files', "", 'file list'),
425 ('t', 'text', "", 'commit text'),
426 ('l', 'logfile', "", 'commit text file')],
427 'hg rawcommit [options] [files]'),
312 "recover": (recover, [], "hg recover"),
428 "recover": (recover, [], "hg recover"),
313 "remove": (remove, [], "hg remove [files]"),
429 "remove": (remove, [], "hg remove [files]"),
314 "resolve": (resolve, [], 'hg resolve [node]'),
430 "resolve": (resolve, [], 'hg resolve [node]'),
@@ -371,7 +487,7 b' def dispatch(args):'
371 d = lambda: i[0](u, *args, **cmdoptions)
487 d = lambda: i[0](u, *args, **cmdoptions)
372
488
373 try:
489 try:
374 d()
490 return d()
375 except SignalInterrupt:
491 except SignalInterrupt:
376 u.warn("killed!\n")
492 u.warn("killed!\n")
377 except KeyboardInterrupt:
493 except KeyboardInterrupt:
General Comments 0
You need to be logged in to leave comments. Login now