# HG changeset patch # User mpm@selenic.com # Date 1117916054 28800 # Node ID 96cde50a746f9ec48ada33999ab6194fef9789f7 # Parent fef0f8e041aad2b28566f6b3262fe8a6be70385a Migrate rawcommit, import, export, history, and merge -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Migrate rawcommit, import, export, history, and merge manifest hash: f932108ee40e34b460e94b6fe60d6a06ac9f760c -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCoguVywK+sNU5EO8RAtohAKCe9Qr5R+YeLRluJlTxRGrJW/nnoQCfW/+F I0BSOeNpb6jdUxTZY1jV0xo= =hNXm -----END PGP SIGNATURE----- diff -r fef0f8e041aa -r 96cde50a746f hg --- a/hg Sat Jun 04 11:18:56 2005 -0800 +++ b/hg Sat Jun 04 12:14:14 2005 -0800 @@ -16,55 +16,9 @@ # except: # pass -import sys, os, time +import sys from mercurial import hg, mdiff, fancyopts, ui, commands -def filterfiles(list, files): - l = [ x for x in list if x in files ] - - for f in files: - if f[-1] != os.sep: f += os.sep - l += [ x for x in list if x.startswith(f) ] - return l - -def diff(files = None, node1 = None, node2 = None): - def date(c): - return time.asctime(time.gmtime(float(c[2].split(' ')[0]))) - - if node2: - change = repo.changelog.read(node2) - mmap2 = repo.manifest.read(change[0]) - (c, a, d) = repo.diffrevs(node1, node2) - def read(f): return repo.file(f).read(mmap2[f]) - date2 = date(change) - else: - date2 = time.asctime() - if not node1: - node1 = repo.dirstate.parents()[0] - (c, a, d, u) = repo.diffdir(repo.root, node1) - def read(f): return file(os.path.join(repo.root, f)).read() - - change = repo.changelog.read(node1) - mmap = repo.manifest.read(change[0]) - date1 = date(change) - - if files: - c, a, d = map(lambda x: filterfiles(x, files), (c, a, d)) - - for f in c: - to = repo.file(f).read(mmap[f]) - tn = read(f) - sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f)) - for f in a: - to = "" - tn = read(f) - sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f)) - for f in d: - to = repo.file(f).read(mmap[f]) - tn = "" - sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f)) - - try: sys.exit(commands.dispatch(sys.argv[1:])) except commands.UnknownCommand: @@ -96,90 +50,7 @@ ui.warn("Unable to open repository\n") sys.exit(0) -relpath = None -if os.getcwd() != repo.root: - relpath = os.getcwd()[len(repo.root) + 1: ] - -elif cmd == "rawcommit": - "raw commit interface" - rc = {} - opts = [('p', 'parent', [], 'parent'), - ('d', 'date', "", 'data'), - ('u', 'user', "", 'user'), - ('F', 'files', "", 'file list'), - ('t', 'text', "", 'commit text'), - ('l', 'logfile', "", 'commit text file') - ] - args = fancyopts.fancyopts(args, opts, rc, - "hg rawcommit [options] files") - text = rc['text'] - if not text and rc['logfile']: - try: text = open(rc['logfile']).read() - except IOError: pass - if not text and not rc['logfile']: - print "missing commit text" - sys.exit(0) - if rc['files']: - files = open(rc['files']).read().splitlines() - else: - files = args - - repo.rawcommit(files, text, rc['user'], rc['date'], *rc['parent']) - - -elif cmd == "import" or cmd == "patch": - try: - import psyco - psyco.full() - except: - pass - - ioptions = {} - opts = [('p', 'strip', 1, 'path strip'), - ('b', 'base', "", 'base path'), - ('q', 'quiet', "", 'silence diff') - ] - - args = fancyopts.fancyopts(args, opts, ioptions, - 'hg import [options] ') - d = ioptions["base"] - strip = ioptions["strip"] - quiet = ioptions["quiet"] and "> /dev/null" or "" - - for patch in args: - ui.status("applying %s\n" % patch) - pf = os.path.join(d, patch) - - text = "" - for l in file(pf): - if l[:4] == "--- ": break - text += l - - f = os.popen("lsdiff --strip %d %s" % (strip, pf)) - files = filter(None, map(lambda x: x.rstrip(), f.read().splitlines())) - f.close() - - if files: - if os.system("patch -p%d < %s %s" % (strip, pf, quiet)): - raise "patch failed!" - repo.commit(files, text) - -elif cmd == "export": - node = repo.lookup(args[0]) - prev, other = repo.changelog.parents(node) - change = repo.changelog.read(node) - print "# HG changeset patch" - print "# User %s" % change[1] - print "# Node ID %s" % hg.hex(node) - print "# Parent %s" % hg.hex(prev) - print - if other != hg.nullid: - print "# Parent %s" % hg.hex(other) - print change[4] - - diff(None, prev, node) - -elif cmd == "debugchangegroup": +if cmd == "debugchangegroup": newer = repo.newer(map(repo.lookup, args)) for chunk in repo.changegroup(newer): sys.stdout.write(chunk) @@ -188,25 +59,6 @@ data = sys.stdin.read() repo.addchangegroup(data) -elif cmd == "history": - for i in range(repo.changelog.count()): - n = repo.changelog.node(i) - changes = repo.changelog.read(n) - (p1, p2) = repo.changelog.parents(n) - (h, h1, h2) = map(hg.hex, (n, p1, p2)) - (i1, i2) = map(repo.changelog.rev, (p1, p2)) - print "rev: %4d:%s" % (i, h) - print "parents: %4d:%s" % (i1, h1) - if i2: print " %4d:%s" % (i2, h2) - print "manifest: %4d:%s" % (repo.manifest.rev(changes[0]), - hg.hex(changes[0])) - print "user:", changes[1] - print "date:", time.asctime( - time.localtime(float(changes[2].split(' ')[0]))) - if ui.verbose: print "files:", " ".join(changes[3]) - print "description:" - print changes[4] - elif cmd == "dump": if args: r = repo.file(args[0]) @@ -253,25 +105,6 @@ print "\t%d -> %d" % (r.rev(e[5]), i) print "}" -elif cmd == "merge": - if args: - paths = {} - try: - pf = os.path.join(os.environ["HOME"], ".hgpaths") - for l in file(pf): - name, path = l.split() - paths[name] = path - except: - pass - - if args[0] in paths: args[0] = paths[args[0]] - - other = hg.repository(ui, args[0]) - cg = repo.getchangegroup(other) - repo.addchangegroup(cg) - else: - print "missing source repository" - elif cmd == "tags": repo.lookup(0) # prime the cache i = repo.tags.items() diff -r fef0f8e041aa -r 96cde50a746f mercurial/commands.py --- a/mercurial/commands.py Sat Jun 04 11:18:56 2005 -0800 +++ b/mercurial/commands.py Sat Jun 04 12:14:14 2005 -0800 @@ -183,6 +183,22 @@ dodiff(repo, files, *revs) +def export(ui, repo, changeset): + node = repo.lookup(changeset) + prev, other = repo.changelog.parents(node) + change = repo.changelog.read(node) + print "# HG changeset patch" + print "# User %s" % change[1] + print "# Node ID %s" % hg.hex(node) + print "# Parent %s" % hg.hex(prev) + print + if other != hg.nullid: + print "# Parent %s" % hg.hex(other) + print change[4].rstrip() + print + + dodiff(repo, None, prev, node) + def forget(ui, repo, file, *files): """don't add the specified files on the next commit""" repo.forget(relpath(repo, (file,) + files)) @@ -207,6 +223,56 @@ print "description:" print changes[4] +def history(ui, repo): + """show the changelog history""" + for i in range(repo.changelog.count()): + n = repo.changelog.node(i) + changes = repo.changelog.read(n) + (p1, p2) = repo.changelog.parents(n) + (h, h1, h2) = map(hg.hex, (n, p1, p2)) + (i1, i2) = map(repo.changelog.rev, (p1, p2)) + print "rev: %4d:%s" % (i, h) + print "parents: %4d:%s" % (i1, h1) + if i2: print " %4d:%s" % (i2, h2) + print "manifest: %4d:%s" % (repo.manifest.rev(changes[0]), + hg.hex(changes[0])) + print "user:", changes[1] + print "date:", time.asctime( + time.localtime(float(changes[2].split(' ')[0]))) + if ui.verbose: print "files:", " ".join(changes[3]) + print "description:" + print changes[4] + +def patch(ui, repo, patches, opts): + """import an ordered set of patches""" + try: + import psyco + psyco.full() + except: + pass + + d = opts["base"] + strip = opts["strip"] + quiet = opts["quiet"] and "> /dev/null" or "" + + for patch in patches: + ui.status("applying %s\n" % patch) + pf = os.path.join(d, patch) + + text = "" + for l in file(pf): + if l[:4] == "--- ": break + text += l + + f = os.popen("lsdiff --strip %d %s" % (strip, pf)) + files = filter(None, map(lambda x: x.rstrip(), f.read().splitlines())) + f.close() + + if files: + if os.system("patch -p%d < %s %s" % (strip, pf, quiet)): + raise "patch failed!" + repo.commit(files, text) + def init(ui): """create a repository""" hg.repository(ui, ".", create=1) @@ -245,6 +311,40 @@ if n != hg.nullid: ui.write("%d:%s\n" % (repo.changelog.rev(n), hg.hex(n))) +def pull(ui, repo, source): + """pull changes from the specified source""" + paths = {} + try: + pf = os.path.expanduser("~/.hgpaths") + for l in file(pf): + name, path = l.split() + paths[name] = path + except IOError: + pass + + if source in paths: source = paths[source] + + other = hg.repository(ui, source) + cg = repo.getchangegroup(other) + repo.addchangegroup(cg) + +def rawcommit(ui, repo, files, rc): + "raw commit interface" + + text = rc['text'] + if not text and rc['logfile']: + try: text = open(rc['logfile']).read() + except IOError: pass + if not text and not rc['logfile']: + print "missing commit text" + return 1 + + files = relpath(repo, files) + if rc['files']: + files += open(rc['files']).read().splitlines() + + repo.rawcommit(files, text, rc['user'], rc['date'], *rc['parent']) + def recover(ui, repo): repo.recover() @@ -303,12 +403,28 @@ "commit|ci": (commit, [], 'hg commit [files]'), "diff": (diff, [('r', 'rev', [], 'revision')], 'hg diff [-r A] [-r B] [files]'), + "export": (export, [], "hg export "), "forget": (forget, [], "hg forget [files]"), "heads": (heads, [], 'hg heads'), + "history": (history, [], 'hg history'), "help": (help, [], 'hg help [command]'), "init": (init, [], 'hg init'), "log": (log, [], 'hg log '), "parents": (parents, [], 'hg parents [node]'), + "patch|import": (patch, + [('p', 'strip', 1, 'path strip'), + ('b', 'base', "", 'base path'), + ('q', 'quiet', "", 'silence diff')], + "hg import [options] patches"), + "pull|merge": (pull, [], 'hg pull [source]'), + "rawcommit": (rawcommit, + [('p', 'parent', [], 'parent'), + ('d', 'date', "", 'data'), + ('u', 'user', "", 'user'), + ('F', 'files', "", 'file list'), + ('t', 'text', "", 'commit text'), + ('l', 'logfile', "", 'commit text file')], + 'hg rawcommit [options] [files]'), "recover": (recover, [], "hg recover"), "remove": (remove, [], "hg remove [files]"), "resolve": (resolve, [], 'hg resolve [node]'), @@ -371,7 +487,7 @@ d = lambda: i[0](u, *args, **cmdoptions) try: - d() + return d() except SignalInterrupt: u.warn("killed!\n") except KeyboardInterrupt: