Mercurial > hg
changeset 356:7dec9a46d82a
hgit rev-list support
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
hgit rev-list support
From: Chris Mason <mason@suse.com>
Update hgit rev-list support, make it a special case of hgit rev-tree
Print newest commit first
Add the ability to specify the max number of commits to print (-n or --max-nr=)
Match git feature of stopping at a given commit (hgit rev-list start_commit sto\p_commit)
manifest hash: b9bbd5e95dae771ebef89f8f4102e458052b1835
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (GNU/Linux)
iD8DBQFCsG26ywK+sNU5EO8RAm5OAJ46G1nhXN2kQ+cKaBOK+oX4zSdQRgCdECvG
6wbG0JRdm7S29K4ynzs4cyY=
=pwpz
-----END PGP SIGNATURE-----
author | mpm@selenic.com |
---|---|
date | Wed, 15 Jun 2005 10:04:42 -0800 |
parents | 3e18360a8912 |
children | 1cb3d9d5119e |
files | contrib/hgit |
diffstat | 1 files changed, 36 insertions(+), 21 deletions(-) [+] |
line wrap: on
line diff
--- a/contrib/hgit Wed Jun 15 10:02:41 2005 -0800 +++ b/contrib/hgit Wed Jun 15 10:04:42 2005 -0800 @@ -128,7 +128,7 @@ # telling you which commits are reachable from the supplied ones via # a bitmask based on arg position. # you can specify a commit to stop at by starting the sha1 with ^ -def revtree(args, repo): +def revtree(args, repo, full="tree", maxnr=0): # calculate and return the reachability bitmask for sha def is_reachable(ar, reachable, sha): if len(ar) == 0: @@ -143,6 +143,7 @@ reachable = [] stop_sha1 = [] want_sha1 = [] + count = 0 # figure out which commits they are asking for and which ones they # want us to stop on @@ -153,6 +154,7 @@ want_sha1.append(s) elif args[i] != 'HEAD': want_sha1.append(args[i]) + # calculate the graph for the supplied commits for i in range(len(want_sha1)): reachable.append({}); @@ -169,40 +171,53 @@ visit.append(p) if p in stop_sha1: break + # walk the repository looking for commits that are in our # reachability graph - for i in range(repo.changelog.count()): + for i in range(repo.changelog.count()-1, -1, -1): n = repo.changelog.node(i) mask = is_reachable(want_sha1, reachable, n) if mask: - 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)) + if not full: + print hg.hex(n) + elif full is "commit": + print hg.hex(n) + catcommit(repo, n, ' ') + else: + 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)) - date = changes[2].split(' ')[0] - print "%s %s:%s" % (date, h, mask), - mask = is_reachable(want_sha1, reachable, p1) - if i1 != -1 and mask > 0: - print "%s:%s " % (h1, mask), - mask = is_reachable(want_sha1, reachable, p2) - if i2 != -1 and mask > 0: - print "%s:%s " % (h2, mask), - print "" + date = changes[2].split(' ')[0] + print "%s %s:%s" % (date, h, mask), + mask = is_reachable(want_sha1, reachable, p1) + if i1 != -1 and mask > 0: + print "%s:%s " % (h1, mask), + mask = is_reachable(want_sha1, reachable, p2) + if i2 != -1 and mask > 0: + print "%s:%s " % (h2, mask), + print "" + if maxnr and count >= maxnr: + break + count += 1 # git rev-list tries to order things by date, and has the ability to stop # at a given commit without walking the whole repo. TODO add the stop # parameter def revlist(args, repo): doptions = {} - opts = [('c', 'commit', None, 'commit')] + opts = [('c', 'commit', None, 'commit'), + ('n', 'max-nr', 0, 'max-nr')] args = fancyopts.fancyopts(args, opts, doptions, 'hg rev-list') - for i in range(repo.changelog.count()): - n = repo.changelog.node(i) - print hg.hex(n) - if doptions['commit']: - catcommit(repo, n, ' ') + if doptions['commit']: + full = "commit" + else: + full = None + for i in range(1, len(args)): + args[i] = '^' + args[i] + revtree(args, repo, full, doptions['max-nr']) def catchterm(*args): raise SignalInterrupt