contrib/hgit
author mpm@selenic.com
Tue, 28 Jun 2005 02:08:14 -0800
changeset 503 c6a2e41c8c60
parent 429 688d03d6997a
child 719 dda258572847
child 737 8db4d406b3d3
permissions -rwxr-xr-x
Fix troubles with clone and exception handling -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Fix troubles with clone and exception handling Clone deletes its directory on failure This was deleting the lockfile out from under the lock object before it got destroyed This patch shuts lock up and makes the cleanup code for clone a little cleaner. manifest hash: f666fddcf6f3a905020a091f5e9fd2cb5d806cdd -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCwSGOywK+sNU5EO8RAkx2AKCIxPczl9YWnuUM+bMQnpVr8kv6uQCeNWld SUxSB99PGJHhq1LWFaSJJNw= =Frk/ -----END PGP SIGNATURE-----
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
     1
#!/usr/bin/env python
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
     2
#
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
     3
# Minimal support for git commands on an hg repository
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
     4
#
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
     5
# Copyright 2005 Chris Mason <mason@suse.com>
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
     6
#
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
     7
# This software may be used and distributed according to the terms
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
     8
# of the GNU General Public License, incorporated herein by reference.
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
     9
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    10
import time, sys, signal
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    11
from mercurial import hg, mdiff, fancyopts, commands, ui
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    12
    
396
8f8bb77d560e Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 357
diff changeset
    13
def difftree(args, ui, repo):
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    14
    def __difftree(repo, files = None, node1 = None, node2 = None):
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    15
        def date(c):
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    16
            return time.asctime(time.gmtime(float(c[2].split(' ')[0])))
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    17
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    18
        if node2:
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    19
            change = repo.changelog.read(node2)
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    20
            mmap2 = repo.manifest.read(change[0])
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    21
            (c, a, d) = repo.diffrevs(node1, node2)
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    22
            def read(f): return repo.file(f).read(mmap2[f])
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    23
            date2 = date(change)
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    24
        else:
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    25
            date2 = time.asctime()
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    26
            (c, a, d, u) = repo.diffdir(repo.root, node1)
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    27
            if not node1:
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    28
                node1 = repo.dirstate.parents()[0]
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    29
            def read(f): return file(os.path.join(repo.root, f)).read()
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    30
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    31
        change = repo.changelog.read(node1)
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    32
        mmap = repo.manifest.read(change[0])
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    33
        date1 = date(change)
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    34
        empty = "0" * 40;
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    35
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    36
        if files:
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    37
            c, a, d = map(lambda x: filterfiles(files, x), (c, a, d))
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    38
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    39
        for f in c:
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    40
            # TODO get file permissions
406
d8abb687d501 [PATCH] Using monotone-viz/git-viz with mercurial
mpm@selenic.com
parents: 396
diff changeset
    41
            print ":100664 100664 %s %s M\t%s\t%s" % (hg.hex(mmap[f]), 
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    42
                                                      hg.hex(mmap2[f]), f, f)
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    43
        for f in a:
406
d8abb687d501 [PATCH] Using monotone-viz/git-viz with mercurial
mpm@selenic.com
parents: 396
diff changeset
    44
            print ":000000 100664 %s %s N\t%s\t%s" % (empty, hg.hex(mmap2[f]), f, f)
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    45
        for f in d:
406
d8abb687d501 [PATCH] Using monotone-viz/git-viz with mercurial
mpm@selenic.com
parents: 396
diff changeset
    46
            print ":100664 000000 %s %s D\t%s\t%s" % (hg.hex(mmap[f]), empty, f, f)
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    47
    ##
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    48
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    49
    revs = []
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    50
    if args:
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    51
        doptions = {}
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    52
        opts = [('p', 'patch', None, 'patch'),
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    53
                ('r', 'recursive', None, 'recursive')]
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    54
        args = fancyopts.fancyopts(args, opts, doptions,
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    55
                                   'hg diff-tree [options] sha1 sha1')
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    56
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    57
    if len(args) < 2:
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    58
        help()
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    59
        sys.exit(1)
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    60
    revs.append(repo.lookup(args[0]))
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    61
    revs.append(repo.lookup(args[1]))
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    62
    args = args[2:]
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    63
    if doptions['patch']:
396
8f8bb77d560e Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 357
diff changeset
    64
        commands.dodiff(ui, repo, "", args, *revs)
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    65
    else:
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    66
        __difftree(repo, args, *revs)
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    67
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    68
def catcommit(repo, n, prefix):
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    69
    nlprefix = '\n' + prefix;
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    70
    changes = repo.changelog.read(n)
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    71
    (p1, p2) = repo.changelog.parents(n)
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    72
    (h, h1, h2) = map(hg.hex, (n, p1, p2))
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    73
    (i1, i2) = map(repo.changelog.rev, (p1, p2))
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    74
    print "tree %s" % (h)
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    75
    if i1 != -1: print "%sparent %s" % (prefix, h1)
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    76
    if i2 != -1: print "%sparent %s" % (prefix, h2)
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    77
    date_ar = changes[2].split(' ')
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    78
    date = int(float(date_ar[0]))
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    79
    print "%sauthor <%s> %s %s" % (prefix, changes[1], date, date_ar[1])
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    80
    print "%scommitter <%s> %s %s" % (prefix, changes[1], date, date_ar[1])
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    81
    print prefix
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    82
    if prefix != "":
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    83
        print "%s%s" % (prefix, changes[4].replace('\n', nlprefix).strip())
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    84
    else:
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    85
        print changes[4]
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    86
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    87
def catfile(args, ui, repo):
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    88
    doptions = {}
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    89
    opts = [('s', 'stdin', None, 'stdin')]
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    90
    args = fancyopts.fancyopts(args, opts, doptions,
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    91
                               'hg cat-file type sha1')
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    92
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    93
    # in stdin mode, every line except the commit is prefixed with two
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    94
    # spaces.  This way the our caller can find the commit without magic
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    95
    # strings
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    96
    #
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    97
    prefix = ""
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    98
    if doptions['stdin']:
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
    99
        try:
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   100
            (type, r) = raw_input().split(' ');
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   101
            prefix = "  "
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   102
        except EOFError:
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   103
            return
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   104
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   105
    else:
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   106
        if len(args) < 2:
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   107
            help()
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   108
            sys.exit(1)
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   109
        type = args[0]
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   110
        r = args[1]
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   111
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   112
    while r:
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   113
        if type != "commit":
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   114
            sys.stderr.write("aborting hg cat-file only understands commits\n")
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   115
            sys.exit(1);
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   116
        n = repo.changelog.lookup(r)
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   117
        catcommit(repo, n, prefix)
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   118
        if doptions['stdin']:
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   119
            try:
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   120
                (type, r) = raw_input().split(' ');
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   121
            except EOFError:
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   122
                break
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   123
        else:
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   124
            break
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   125
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   126
# git rev-tree is a confusing thing.  You can supply a number of
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   127
# commit sha1s on the command line, and it walks the commit history
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   128
# telling you which commits are reachable from the supplied ones via
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   129
# a bitmask based on arg position.
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   130
# you can specify a commit to stop at by starting the sha1 with ^
356
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   131
def revtree(args, repo, full="tree", maxnr=0):
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   132
    # calculate and return the reachability bitmask for sha
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   133
    def is_reachable(ar, reachable, sha):
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   134
        if len(ar) == 0:
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   135
            return 1
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   136
        mask = 0
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   137
        for i in range(len(ar)):
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   138
            if sha in reachable[i]:
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   139
                mask |= 1 << i
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   140
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   141
        return mask
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   142
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   143
    reachable = []
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   144
    stop_sha1 = []
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   145
    want_sha1 = []
356
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   146
    count = 0
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   147
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   148
    # figure out which commits they are asking for and which ones they
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   149
    # want us to stop on
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   150
    for i in range(len(args)):
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   151
        if args[i].count('^'):
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   152
            s = args[i].split('^')[1]
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   153
            stop_sha1.append(repo.changelog.lookup(s))
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   154
            want_sha1.append(s)
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   155
        elif args[i] != 'HEAD':
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   156
            want_sha1.append(args[i])
356
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   157
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   158
    # calculate the graph for the supplied commits
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   159
    for i in range(len(want_sha1)):
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   160
        reachable.append({});
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   161
        n = repo.changelog.lookup(want_sha1[i]);
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   162
        visit = [n];
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   163
        reachable[i][n] = 1
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   164
        while visit:
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   165
            n = visit.pop(0)
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   166
            if n in stop_sha1:
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   167
                break
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   168
            for p in repo.changelog.parents(n):
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   169
                if p not in reachable[i]:
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   170
                    reachable[i][p] = 1
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   171
                    visit.append(p)
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   172
                if p in stop_sha1:
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   173
                    break
356
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   174
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   175
    # walk the repository looking for commits that are in our
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   176
    # reachability graph
356
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   177
    for i in range(repo.changelog.count()-1, -1, -1):
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   178
        n = repo.changelog.node(i)
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   179
        mask = is_reachable(want_sha1, reachable, n)
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   180
        if mask:
356
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   181
            if not full:
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   182
                print hg.hex(n)
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   183
            elif full is "commit":
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   184
                print hg.hex(n)
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   185
                catcommit(repo, n, '  ')
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   186
            else:
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   187
                changes = repo.changelog.read(n)
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   188
                (p1, p2) = repo.changelog.parents(n)
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   189
                (h, h1, h2) = map(hg.hex, (n, p1, p2))
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   190
                (i1, i2) = map(repo.changelog.rev, (p1, p2))
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   191
356
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   192
                date = changes[2].split(' ')[0]
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   193
                print "%s %s:%s" % (date, h, mask),
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   194
                mask = is_reachable(want_sha1, reachable, p1)
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   195
                if i1 != -1 and mask > 0:
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   196
                    print "%s:%s " % (h1, mask),
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   197
                mask = is_reachable(want_sha1, reachable, p2)
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   198
                if i2 != -1 and mask > 0:
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   199
                    print "%s:%s " % (h2, mask),
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   200
                print ""
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   201
            if maxnr and count >= maxnr:
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   202
                break
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   203
            count += 1
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   204
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   205
# git rev-list tries to order things by date, and has the ability to stop
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   206
# at a given commit without walking the whole repo.  TODO add the stop
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   207
# parameter
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   208
def revlist(args, repo):
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   209
    doptions = {}
356
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   210
    opts = [('c', 'commit', None, 'commit'),
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   211
            ('n', 'max-nr', 0, 'max-nr')]
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   212
    args = fancyopts.fancyopts(args, opts, doptions,
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   213
                               'hg rev-list')
356
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   214
    if doptions['commit']:
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   215
        full = "commit"
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   216
    else:
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   217
        full = None
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   218
    for i in range(1, len(args)):
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   219
        args[i] = '^' + args[i]
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   220
    revtree(args, repo, full, doptions['max-nr'])
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   221
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   222
def catchterm(*args):
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   223
    raise SignalInterrupt
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   224
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   225
def help():
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   226
    sys.stderr.write("commands:\n")
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   227
    sys.stderr.write("  hgit cat-file [type] sha1\n")
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   228
    sys.stderr.write("  hgit diff-tree [-p] [-r] sha1 sha1\n")
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   229
    sys.stderr.write("  hgit rev-tree [sha1 ... [^stop sha1]]\n")
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   230
    sys.stderr.write("  hgit rev-list [-c]\n")
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   231
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   232
cmd = sys.argv[1]
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   233
args = sys.argv[2:]
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   234
u = ui.ui()
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   235
signal.signal(signal.SIGTERM, catchterm)
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   236
repo = hg.repository(ui = u)
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   237
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   238
if cmd == "diff-tree":
396
8f8bb77d560e Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 357
diff changeset
   239
    difftree(args, u, repo)
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   240
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   241
elif cmd == "cat-file":
396
8f8bb77d560e Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 357
diff changeset
   242
    catfile(args, u, repo)
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   243
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   244
elif cmd == "rev-tree":
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   245
    revtree(args, repo)
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   246
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   247
elif cmd == "rev-list":
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   248
    revlist(args, repo)
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   249
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   250
elif cmd == "help":
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   251
    help()
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   252
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   253
else:
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   254
    if cmd: sys.stderr.write("unknown command\n\n")
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   255
    help()
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   256
    sys.exit(1)
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   257
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   258
sys.exit(0)