hgext/transplant.py
author Matt Mackall <mpm@selenic.com>
Sun, 26 Sep 2010 14:39:34 -0500
changeset 12518 89f1210a1238
parent 12349 7340b0fa049a
child 12581 19dabc8a3236
permissions -rw-r--r--
tests: unify test-convert-clonebranches
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
     1
# Patch transplanting extension for Mercurial
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
     2
#
4635
63b9d2deed48 Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4516
diff changeset
     3
# Copyright 2006, 2007 Brendan Cully <brendan@kublai.com>
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
     4
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8209
diff changeset
     5
# This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9995
diff changeset
     6
# GNU General Public License version 2 or any later version.
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
     7
8934
9dda4c73fc3b extensions: change descriptions for extensions providing a few commands
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8894
diff changeset
     8
'''command to transplant changesets from another branch
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
     9
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    10
This extension allows you to transplant patches from another branch.
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    11
8000
83d7c9cfb065 transplant: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7874
diff changeset
    12
Transplanted patches are recorded in .hg/transplant/transplants, as a
83d7c9cfb065 transplant: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7874
diff changeset
    13
map from a changeset hash to its hash in the source repository.
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    14
'''
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    15
7629
97253bcb44a8 transplant: move docstrings before imports (see issue1466)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7415
diff changeset
    16
from mercurial.i18n import _
97253bcb44a8 transplant: move docstrings before imports (see issue1466)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7415
diff changeset
    17
import os, tempfile
8703
8676dd819444 transplant: use match object rather than files for commit
Matt Mackall <mpm@selenic.com>
parents: 8615
diff changeset
    18
from mercurial import bundlerepo, changegroup, cmdutil, hg, merge, match
11301
3d0591a66118 move discovery methods from localrepo into new discovery module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11193
diff changeset
    19
from mercurial import patch, revlog, util, error, discovery
7629
97253bcb44a8 transplant: move docstrings before imports (see issue1466)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7415
diff changeset
    20
8778
c5f36402daad use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8706
diff changeset
    21
class transplantentry(object):
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    22
    def __init__(self, lnode, rnode):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    23
        self.lnode = lnode
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    24
        self.rnode = rnode
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    25
8778
c5f36402daad use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8706
diff changeset
    26
class transplants(object):
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    27
    def __init__(self, path=None, transplantfile=None, opener=None):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    28
        self.path = path
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    29
        self.transplantfile = transplantfile
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    30
        self.opener = opener
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    31
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    32
        if not opener:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    33
            self.opener = util.opener(self.path)
12313
2912881c2a98 transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12266
diff changeset
    34
        self.transplants = {}
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    35
        self.dirty = False
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    36
        self.read()
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    37
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    38
    def read(self):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    39
        abspath = os.path.join(self.path, self.transplantfile)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    40
        if self.transplantfile and os.path.exists(abspath):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    41
            for line in self.opener(self.transplantfile).read().splitlines():
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    42
                lnode, rnode = map(revlog.bin, line.split(':'))
12313
2912881c2a98 transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12266
diff changeset
    43
                list = self.transplants.setdefault(rnode, [])
2912881c2a98 transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12266
diff changeset
    44
                list.append(transplantentry(lnode, rnode))
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    45
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    46
    def write(self):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    47
        if self.dirty and self.transplantfile:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    48
            if not os.path.isdir(self.path):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    49
                os.mkdir(self.path)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    50
            fp = self.opener(self.transplantfile, 'w')
12349
7340b0fa049a transplant: fix var name conflict introduced by 2912881c2a98
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12347
diff changeset
    51
            for list in self.transplants.itervalues():
7340b0fa049a transplant: fix var name conflict introduced by 2912881c2a98
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12347
diff changeset
    52
                for t in list:
7340b0fa049a transplant: fix var name conflict introduced by 2912881c2a98
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12347
diff changeset
    53
                    l, r = map(revlog.hex, (t.lnode, t.rnode))
12313
2912881c2a98 transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12266
diff changeset
    54
                    fp.write(l + ':' + r + '\n')
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    55
            fp.close()
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    56
        self.dirty = False
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    57
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    58
    def get(self, rnode):
12313
2912881c2a98 transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12266
diff changeset
    59
        return self.transplants.get(rnode) or []
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    60
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    61
    def set(self, lnode, rnode):
12313
2912881c2a98 transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12266
diff changeset
    62
        list = self.transplants.setdefault(rnode, [])
2912881c2a98 transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12266
diff changeset
    63
        list.append(transplantentry(lnode, rnode))
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    64
        self.dirty = True
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    65
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    66
    def remove(self, transplant):
12313
2912881c2a98 transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12266
diff changeset
    67
        list = self.transplants.get(transplant.rnode)
2912881c2a98 transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12266
diff changeset
    68
        if list:
2912881c2a98 transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12266
diff changeset
    69
            del list[list.index(transplant)]
2912881c2a98 transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12266
diff changeset
    70
            self.dirty = True
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    71
8778
c5f36402daad use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8706
diff changeset
    72
class transplanter(object):
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    73
    def __init__(self, ui, repo):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    74
        self.ui = ui
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    75
        self.path = repo.join('transplant')
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    76
        self.opener = util.opener(self.path)
7744
b44dbb95f07f transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents: 7633
diff changeset
    77
        self.transplants = transplants(self.path, 'transplants',
b44dbb95f07f transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents: 7633
diff changeset
    78
                                       opener=self.opener)
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    79
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    80
    def applied(self, repo, node, parent):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    81
        '''returns True if a node is already an ancestor of parent
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    82
        or has already been transplanted'''
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    83
        if hasnode(repo, node):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    84
            if node in repo.changelog.reachable(parent, stop=node):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    85
                return True
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    86
        for t in self.transplants.get(node):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    87
            # it might have been stripped
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    88
            if not hasnode(repo, t.lnode):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    89
                self.transplants.remove(t)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    90
                return False
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    91
            if t.lnode in repo.changelog.reachable(parent, stop=t.lnode):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    92
                return True
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    93
        return False
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    94
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    95
    def apply(self, repo, source, revmap, merges, opts={}):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    96
        '''apply the revisions in revmap one by one in revision order'''
8209
a1a5a57efe90 replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents: 8176
diff changeset
    97
        revs = sorted(revmap)
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    98
        p1, p2 = repo.dirstate.parents()
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    99
        pulls = []
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   100
        diffopts = patch.diffopts(self.ui, opts)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   101
        diffopts.git = True
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   102
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4680
diff changeset
   103
        lock = wlock = None
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   104
        try:
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4680
diff changeset
   105
            wlock = repo.wlock()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4680
diff changeset
   106
            lock = repo.lock()
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   107
            for rev in revs:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   108
                node = revmap[rev]
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   109
                revstr = '%s:%s' % (rev, revlog.short(node))
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   110
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   111
                if self.applied(repo, node, p1):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   112
                    self.ui.warn(_('skipping already applied revision %s\n') %
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   113
                                 revstr)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   114
                    continue
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   115
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   116
                parents = source.changelog.parents(node)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   117
                if not opts.get('filter'):
7744
b44dbb95f07f transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents: 7633
diff changeset
   118
                    # If the changeset parent is the same as the
b44dbb95f07f transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents: 7633
diff changeset
   119
                    # wdir's parent, just pull it.
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   120
                    if parents[0] == p1:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   121
                        pulls.append(node)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   122
                        p1 = node
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   123
                        continue
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   124
                    if pulls:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   125
                        if source != repo:
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
   126
                            repo.pull(source, heads=pulls)
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
   127
                        merge.update(repo, pulls[-1], False, False, None)
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   128
                        p1, p2 = repo.dirstate.parents()
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   129
                        pulls = []
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   130
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   131
                domerge = False
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   132
                if node in merges:
7744
b44dbb95f07f transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents: 7633
diff changeset
   133
                    # pulling all the merge revs at once would mean we
b44dbb95f07f transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents: 7633
diff changeset
   134
                    # couldn't transplant after the latest even if
b44dbb95f07f transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents: 7633
diff changeset
   135
                    # transplants before them fail.
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   136
                    domerge = True
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   137
                    if not hasnode(repo, node):
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
   138
                        repo.pull(source, heads=[node])
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   139
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   140
                if parents[1] != revlog.nullid:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   141
                    self.ui.note(_('skipping merge changeset %s:%s\n')
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   142
                                 % (rev, revlog.short(node)))
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   143
                    patchfile = None
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   144
                else:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   145
                    fd, patchfile = tempfile.mkstemp(prefix='hg-transplant-')
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   146
                    fp = os.fdopen(fd, 'w')
7308
b6f5490effbf patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7280
diff changeset
   147
                    gen = patch.diff(source, parents[0], node, opts=diffopts)
b6f5490effbf patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7280
diff changeset
   148
                    for chunk in gen:
b6f5490effbf patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7280
diff changeset
   149
                        fp.write(chunk)
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   150
                    fp.close()
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   151
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   152
                del revmap[rev]
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   153
                if patchfile or domerge:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   154
                    try:
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
   155
                        n = self.applyone(repo, node,
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
   156
                                          source.changelog.read(node),
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   157
                                          patchfile, merge=domerge,
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   158
                                          log=opts.get('log'),
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
   159
                                          filter=opts.get('filter'))
4251
e76e52145c3d transplant: fix ignoring empty changesets (eg after filter)
Brendan Cully <brendan@kublai.com>
parents: 4072
diff changeset
   160
                        if n and domerge:
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   161
                            self.ui.status(_('%s merged at %s\n') % (revstr,
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   162
                                      revlog.short(n)))
4251
e76e52145c3d transplant: fix ignoring empty changesets (eg after filter)
Brendan Cully <brendan@kublai.com>
parents: 4072
diff changeset
   163
                        elif n:
7744
b44dbb95f07f transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents: 7633
diff changeset
   164
                            self.ui.status(_('%s transplanted to %s\n')
b44dbb95f07f transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents: 7633
diff changeset
   165
                                           % (revlog.short(node),
b44dbb95f07f transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents: 7633
diff changeset
   166
                                              revlog.short(n)))
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   167
                    finally:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   168
                        if patchfile:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   169
                            os.unlink(patchfile)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   170
            if pulls:
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
   171
                repo.pull(source, heads=pulls)
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
   172
                merge.update(repo, pulls[-1], False, False, None)
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   173
        finally:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   174
            self.saveseries(revmap, merges)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   175
            self.transplants.write()
8112
6ee71f78497c switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8076
diff changeset
   176
            lock.release()
6ee71f78497c switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8076
diff changeset
   177
            wlock.release()
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   178
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   179
    def filter(self, filter, changelog, patchfile):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   180
        '''arbitrarily rewrite changeset before applying it'''
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   181
6966
057ced2b8543 i18n: mark strings for translation in transplant extension
Martin Geisler <mg@daimi.au.dk>
parents: 6762
diff changeset
   182
        self.ui.status(_('filtering %s\n') % patchfile)
3759
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   183
        user, date, msg = (changelog[1], changelog[2], changelog[4])
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   184
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   185
        fd, headerfile = tempfile.mkstemp(prefix='hg-transplant-')
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   186
        fp = os.fdopen(fd, 'w')
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   187
        fp.write("# HG changeset patch\n")
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   188
        fp.write("# User %s\n" % user)
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   189
        fp.write("# Date %d %d\n" % date)
9433
f01a22096f1f transplant: Add trailing LF in tmp file for filtering
Mads Kiilerich <mads@kiilerich.com>
parents: 9183
diff changeset
   190
        fp.write(msg + '\n')
3759
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   191
        fp.close()
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   192
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   193
        try:
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   194
            util.system('%s %s %s' % (filter, util.shellquote(headerfile),
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   195
                                   util.shellquote(patchfile)),
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   196
                        environ={'HGUSER': changelog[1]},
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   197
                        onerr=util.Abort, errprefix=_('filter failed'))
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   198
            user, date, msg = self.parselog(file(headerfile))[1:4]
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   199
        finally:
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   200
            os.unlink(headerfile)
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   201
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   202
        return (user, date, msg)
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   203
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   204
    def applyone(self, repo, node, cl, patchfile, merge=False, log=False,
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
   205
                 filter=None):
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   206
        '''apply the patch in patchfile to the repository as a transplant'''
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   207
        (manifest, user, (time, timezone), files, message) = cl[:5]
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   208
        date = "%d %d" % (time, timezone)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   209
        extra = {'transplant_source': node}
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   210
        if filter:
3759
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   211
            (user, date, message) = self.filter(filter, cl, patchfile)
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   212
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   213
        if log:
9183
d0225fa2f6c4 do not translate commit messages
Martin Geisler <mg@lazybytes.net>
parents: 8934
diff changeset
   214
            # we don't translate messages inserted into commits
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   215
            message += '\n(transplanted from %s)' % revlog.hex(node)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   216
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   217
        self.ui.status(_('applying %s\n') % revlog.short(node))
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   218
        self.ui.note('%s %s\n%s\n' % (user, date, message))
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   219
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   220
        if not patchfile and not merge:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   221
            raise util.Abort(_('can only omit patchfile if merging'))
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   222
        if patchfile:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   223
            try:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   224
                files = {}
3726
752884db5037 transplant: recover added/removed files after failed application
Brendan Cully <brendan@kublai.com>
parents: 3725
diff changeset
   225
                try:
7874
d812029cda85 cleanup: drop variables for unused return values
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7744
diff changeset
   226
                    patch.patch(patchfile, self.ui, cwd=repo.root,
8811
8b35b08724eb Make mq, record and transplant honor patch.eol
Patrick Mezard <pmezard@gmail.com>
parents: 8778
diff changeset
   227
                                files=files, eolmode=None)
3726
752884db5037 transplant: recover added/removed files after failed application
Brendan Cully <brendan@kublai.com>
parents: 3725
diff changeset
   228
                    if not files:
7744
b44dbb95f07f transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents: 7633
diff changeset
   229
                        self.ui.warn(_('%s: empty changeset')
b44dbb95f07f transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents: 7633
diff changeset
   230
                                     % revlog.hex(node))
4251
e76e52145c3d transplant: fix ignoring empty changesets (eg after filter)
Brendan Cully <brendan@kublai.com>
parents: 4072
diff changeset
   231
                        return None
3726
752884db5037 transplant: recover added/removed files after failed application
Brendan Cully <brendan@kublai.com>
parents: 3725
diff changeset
   232
                finally:
12266
00658492e2aa patch: break import cycle with cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12067
diff changeset
   233
                    files = cmdutil.updatedir(self.ui, repo, files)
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   234
            except Exception, inst:
3757
faed44bab17b transplant: clobber old series when transplant fails
Brendan Cully <brendan@kublai.com>
parents: 3752
diff changeset
   235
                seriespath = os.path.join(self.path, 'series')
faed44bab17b transplant: clobber old series when transplant fails
Brendan Cully <brendan@kublai.com>
parents: 3752
diff changeset
   236
                if os.path.exists(seriespath):
faed44bab17b transplant: clobber old series when transplant fails
Brendan Cully <brendan@kublai.com>
parents: 3752
diff changeset
   237
                    os.unlink(seriespath)
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   238
                p1 = repo.dirstate.parents()[0]
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   239
                p2 = node
3725
ccc7a9eb0e5e transplant: preserve filter changes in --continue log
Brendan Cully <brendan@kublai.com>
parents: 3724
diff changeset
   240
                self.log(user, date, message, p1, p2, merge=merge)
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   241
                self.ui.write(str(inst) + '\n')
12067
a4fbbe0fbc38 Lowercase error messages
Martin Geisler <mg@lazybytes.net>
parents: 11638
diff changeset
   242
                raise util.Abort(_('fix up the merge and run '
7744
b44dbb95f07f transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents: 7633
diff changeset
   243
                                   'hg transplant --continue'))
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   244
        else:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   245
            files = None
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   246
        if merge:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   247
            p1, p2 = repo.dirstate.parents()
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   248
            repo.dirstate.setparents(p1, node)
8703
8676dd819444 transplant: use match object rather than files for commit
Matt Mackall <mpm@selenic.com>
parents: 8615
diff changeset
   249
            m = match.always(repo.root, '')
8676dd819444 transplant: use match object rather than files for commit
Matt Mackall <mpm@selenic.com>
parents: 8615
diff changeset
   250
        else:
8676dd819444 transplant: use match object rather than files for commit
Matt Mackall <mpm@selenic.com>
parents: 8615
diff changeset
   251
            m = match.exact(repo.root, '', files)
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   252
8706
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8703
diff changeset
   253
        n = repo.commit(message, user, date, extra=extra, match=m)
11638
79231258503b transplant: crash if repo.commit() finds nothing to commit
Greg Ward <greg-hg@gerg.ca>
parents: 11411
diff changeset
   254
        if not n:
79231258503b transplant: crash if repo.commit() finds nothing to commit
Greg Ward <greg-hg@gerg.ca>
parents: 11411
diff changeset
   255
            # Crash here to prevent an unclear crash later, in
79231258503b transplant: crash if repo.commit() finds nothing to commit
Greg Ward <greg-hg@gerg.ca>
parents: 11411
diff changeset
   256
            # transplants.write().  This can happen if patch.patch()
79231258503b transplant: crash if repo.commit() finds nothing to commit
Greg Ward <greg-hg@gerg.ca>
parents: 11411
diff changeset
   257
            # does nothing but claims success or if repo.status() fails
79231258503b transplant: crash if repo.commit() finds nothing to commit
Greg Ward <greg-hg@gerg.ca>
parents: 11411
diff changeset
   258
            # to report changes done by patch.patch().  These both
79231258503b transplant: crash if repo.commit() finds nothing to commit
Greg Ward <greg-hg@gerg.ca>
parents: 11411
diff changeset
   259
            # appear to be bugs in other parts of Mercurial, but dying
79231258503b transplant: crash if repo.commit() finds nothing to commit
Greg Ward <greg-hg@gerg.ca>
parents: 11411
diff changeset
   260
            # here, as soon as we can detect the problem, is preferable
79231258503b transplant: crash if repo.commit() finds nothing to commit
Greg Ward <greg-hg@gerg.ca>
parents: 11411
diff changeset
   261
            # to silently dropping changesets on the floor.
79231258503b transplant: crash if repo.commit() finds nothing to commit
Greg Ward <greg-hg@gerg.ca>
parents: 11411
diff changeset
   262
            raise RuntimeError('nothing committed after transplant')
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   263
        if not merge:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   264
            self.transplants.set(n, node)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   265
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   266
        return n
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   267
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   268
    def resume(self, repo, source, opts=None):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   269
        '''recover last transaction and apply remaining changesets'''
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   270
        if os.path.exists(os.path.join(self.path, 'journal')):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   271
            n, node = self.recover(repo)
3724
ea523d6f5f1a transplant: fix --continue; add --continue test
Brendan Cully <brendan@kublai.com>
parents: 3723
diff changeset
   272
            self.ui.status(_('%s transplanted as %s\n') % (revlog.short(node),
ea523d6f5f1a transplant: fix --continue; add --continue test
Brendan Cully <brendan@kublai.com>
parents: 3723
diff changeset
   273
                                                           revlog.short(n)))
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   274
        seriespath = os.path.join(self.path, 'series')
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   275
        if not os.path.exists(seriespath):
3758
889f7e74a0d9 transplant: log source node when recovering too.
Brendan Cully <brendan@kublai.com>
parents: 3757
diff changeset
   276
            self.transplants.write()
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   277
            return
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   278
        nodes, merges = self.readseries()
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   279
        revmap = {}
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   280
        for n in nodes:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   281
            revmap[source.changelog.rev(n)] = n
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   282
        os.unlink(seriespath)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   283
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   284
        self.apply(repo, source, revmap, merges, opts)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   285
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   286
    def recover(self, repo):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   287
        '''commit working directory using journal metadata'''
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   288
        node, user, date, message, parents = self.readlog()
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   289
        merge = len(parents) == 2
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   290
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   291
        if not user or not date or not message or not parents[0]:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   292
            raise util.Abort(_('transplant log file is corrupt'))
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   293
3758
889f7e74a0d9 transplant: log source node when recovering too.
Brendan Cully <brendan@kublai.com>
parents: 3757
diff changeset
   294
        extra = {'transplant_source': node}
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   295
        wlock = repo.wlock()
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4680
diff changeset
   296
        try:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4680
diff changeset
   297
            p1, p2 = repo.dirstate.parents()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4680
diff changeset
   298
            if p1 != parents[0]:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4680
diff changeset
   299
                raise util.Abort(
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4680
diff changeset
   300
                    _('working dir not at transplant parent %s') %
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4680
diff changeset
   301
                                 revlog.hex(parents[0]))
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4680
diff changeset
   302
            if merge:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4680
diff changeset
   303
                repo.dirstate.setparents(p1, parents[1])
8706
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8703
diff changeset
   304
            n = repo.commit(message, user, date, extra=extra)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4680
diff changeset
   305
            if not n:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4680
diff changeset
   306
                raise util.Abort(_('commit failed'))
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4680
diff changeset
   307
            if not merge:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4680
diff changeset
   308
                self.transplants.set(n, node)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4680
diff changeset
   309
            self.unlog()
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   310
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4680
diff changeset
   311
            return n, node
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4680
diff changeset
   312
        finally:
8112
6ee71f78497c switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8076
diff changeset
   313
            wlock.release()
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   314
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   315
    def readseries(self):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   316
        nodes = []
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   317
        merges = []
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   318
        cur = nodes
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   319
        for line in self.opener('series').read().splitlines():
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   320
            if line.startswith('# Merges'):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   321
                cur = merges
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   322
                continue
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   323
            cur.append(revlog.bin(line))
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   324
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   325
        return (nodes, merges)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   326
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   327
    def saveseries(self, revmap, merges):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   328
        if not revmap:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   329
            return
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   330
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   331
        if not os.path.isdir(self.path):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   332
            os.mkdir(self.path)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   333
        series = self.opener('series', 'w')
8209
a1a5a57efe90 replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents: 8176
diff changeset
   334
        for rev in sorted(revmap):
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   335
            series.write(revlog.hex(revmap[rev]) + '\n')
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   336
        if merges:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   337
            series.write('# Merges\n')
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   338
            for m in merges:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   339
                series.write(revlog.hex(m) + '\n')
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   340
        series.close()
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   341
3759
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   342
    def parselog(self, fp):
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   343
        parents = []
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   344
        message = []
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   345
        node = revlog.nullid
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   346
        inmsg = False
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   347
        for line in fp.read().splitlines():
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   348
            if inmsg:
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   349
                message.append(line)
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   350
            elif line.startswith('# User '):
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   351
                user = line[7:]
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   352
            elif line.startswith('# Date '):
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   353
                date = line[7:]
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   354
            elif line.startswith('# Node ID '):
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   355
                node = revlog.bin(line[10:])
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   356
            elif line.startswith('# Parent '):
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   357
                parents.append(revlog.bin(line[9:]))
11411
5834e79b24f7 transplant: when reading journal, treat only lines starting with "# " special like patch.extract() does
Georg Brandl <georg@python.org>
parents: 11321
diff changeset
   358
            elif not line.startswith('# '):
3759
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   359
                inmsg = True
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   360
                message.append(line)
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   361
        return (node, user, date, '\n'.join(message), parents)
4516
96d8a56d4ef9 Removed trailing whitespace and tabs from python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4251
diff changeset
   362
3725
ccc7a9eb0e5e transplant: preserve filter changes in --continue log
Brendan Cully <brendan@kublai.com>
parents: 3724
diff changeset
   363
    def log(self, user, date, message, p1, p2, merge=False):
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   364
        '''journal changelog metadata for later recover'''
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   365
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   366
        if not os.path.isdir(self.path):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   367
            os.mkdir(self.path)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   368
        fp = self.opener('journal', 'w')
3725
ccc7a9eb0e5e transplant: preserve filter changes in --continue log
Brendan Cully <brendan@kublai.com>
parents: 3724
diff changeset
   369
        fp.write('# User %s\n' % user)
ccc7a9eb0e5e transplant: preserve filter changes in --continue log
Brendan Cully <brendan@kublai.com>
parents: 3724
diff changeset
   370
        fp.write('# Date %s\n' % date)
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   371
        fp.write('# Node ID %s\n' % revlog.hex(p2))
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   372
        fp.write('# Parent ' + revlog.hex(p1) + '\n')
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   373
        if merge:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   374
            fp.write('# Parent ' + revlog.hex(p2) + '\n')
3725
ccc7a9eb0e5e transplant: preserve filter changes in --continue log
Brendan Cully <brendan@kublai.com>
parents: 3724
diff changeset
   375
        fp.write(message.rstrip() + '\n')
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   376
        fp.close()
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   377
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   378
    def readlog(self):
3759
e96f97ca0358 transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents: 3758
diff changeset
   379
        return self.parselog(self.opener('journal'))
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   380
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   381
    def unlog(self):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   382
        '''remove changelog journal'''
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   383
        absdst = os.path.join(self.path, 'journal')
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   384
        if os.path.exists(absdst):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   385
            os.unlink(absdst)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   386
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   387
    def transplantfilter(self, repo, source, root):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   388
        def matchfn(node):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   389
            if self.applied(repo, node, root):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   390
                return False
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   391
            if source.changelog.parents(node)[1] != revlog.nullid:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   392
                return False
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   393
            extra = source.changelog.read(node)[5]
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   394
            cnode = extra.get('transplant_source')
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   395
            if cnode and self.applied(repo, cnode, root):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   396
                return False
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   397
            return True
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   398
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   399
        return matchfn
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   400
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   401
def hasnode(repo, node):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   402
    try:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   403
        return repo.changelog.rev(node) != None
7633
08cabecfa8a8 errors: move revlog errors
Matt Mackall <mpm@selenic.com>
parents: 7629
diff changeset
   404
    except error.RevlogError:
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   405
        return False
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   406
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   407
def browserevs(ui, repo, nodes, opts):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   408
    '''interactively transplant changesets'''
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   409
    def browsehelp(ui):
10510
f77f3383c666 i18n: mark more strings for translation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10394
diff changeset
   410
        ui.write(_('y: transplant this changeset\n'
f77f3383c666 i18n: mark more strings for translation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10394
diff changeset
   411
                   'n: skip this changeset\n'
f77f3383c666 i18n: mark more strings for translation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10394
diff changeset
   412
                   'm: merge at this changeset\n'
f77f3383c666 i18n: mark more strings for translation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10394
diff changeset
   413
                   'p: show patch\n'
f77f3383c666 i18n: mark more strings for translation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10394
diff changeset
   414
                   'c: commit selected changesets\n'
f77f3383c666 i18n: mark more strings for translation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10394
diff changeset
   415
                   'q: cancel transplant\n'
f77f3383c666 i18n: mark more strings for translation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10394
diff changeset
   416
                   '?: show this help\n'))
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   417
3723
c828fca6f38a transplant: show_changeset moved to cmdutil
Brendan Cully <brendan@kublai.com>
parents: 3714
diff changeset
   418
    displayer = cmdutil.show_changeset(ui, repo, opts)
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   419
    transplants = []
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   420
    merges = []
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   421
    for node in nodes:
7369
87158be081b8 cmdutil: use change contexts for cset-printer and cset-templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7308
diff changeset
   422
        displayer.show(repo[node])
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   423
        action = None
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   424
        while not action:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   425
            action = ui.prompt(_('apply changeset? [ynmpcq?]:'))
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   426
            if action == '?':
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   427
                browsehelp(ui)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   428
                action = None
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   429
            elif action == 'p':
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   430
                parent = repo.changelog.parents(node)[0]
7308
b6f5490effbf patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7280
diff changeset
   431
                for chunk in patch.diff(repo, parent, node):
8615
94ca38e63576 use ui instead of repo.ui when the former is in scope
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
   432
                    ui.write(chunk)
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   433
                action = None
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   434
            elif action not in ('y', 'n', 'm', 'c', 'q'):
10510
f77f3383c666 i18n: mark more strings for translation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10394
diff changeset
   435
                ui.write(_('no such option\n'))
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   436
                action = None
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   437
        if action == 'y':
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   438
            transplants.append(node)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   439
        elif action == 'm':
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   440
            merges.append(node)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   441
        elif action == 'c':
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   442
            break
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   443
        elif action == 'q':
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   444
            transplants = ()
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   445
            merges = ()
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   446
            break
10152
56284451a22c Added support for templatevar "footer" to cmdutil.py
Robert Bachmann <rbachm@gmail.com>
parents: 9995
diff changeset
   447
    displayer.close()
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   448
    return (transplants, merges)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   449
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   450
def transplant(ui, repo, *revs, **opts):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   451
    '''transplant changesets from another branch
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   452
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   453
    Selected changesets will be applied on top of the current working
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   454
    directory with the log of the original changeset. If --log is
9274
4e61abab5f4b transplant: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9200
diff changeset
   455
    specified, log messages will have a comment appended of the form::
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   456
9200
6b4c527c3d22 transplant: better reST formatting
Martin Geisler <mg@lazybytes.net>
parents: 9196
diff changeset
   457
      (transplanted from CHANGESETHASH)
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   458
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   459
    You can rewrite the changelog message with the --filter option.
8000
83d7c9cfb065 transplant: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7874
diff changeset
   460
    Its argument will be invoked with the current changelog message as
83d7c9cfb065 transplant: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7874
diff changeset
   461
    $1 and the patch as $2.
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   462
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8000
diff changeset
   463
    If --source/-s is specified, selects changesets from the named
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8000
diff changeset
   464
    repository. If --branch/-b is specified, selects changesets from
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8000
diff changeset
   465
    the branch holding the named revision, up to that revision. If
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8000
diff changeset
   466
    --all/-a is specified, all changesets on the branch will be
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8000
diff changeset
   467
    transplanted, otherwise you will be prompted to select the
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8000
diff changeset
   468
    changesets you want.
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   469
11193
687c7d395f20 Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents: 10510
diff changeset
   470
    :hg:`transplant --branch REVISION --all` will rebase the selected
8000
83d7c9cfb065 transplant: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7874
diff changeset
   471
    branch (up to the named revision) onto your current working
83d7c9cfb065 transplant: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7874
diff changeset
   472
    directory.
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   473
8000
83d7c9cfb065 transplant: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7874
diff changeset
   474
    You can optionally mark selected transplanted changesets as merge
83d7c9cfb065 transplant: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7874
diff changeset
   475
    changesets. You will not be prompted to transplant any ancestors
83d7c9cfb065 transplant: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7874
diff changeset
   476
    of a merged transplant, and you can merge descendants of them
83d7c9cfb065 transplant: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7874
diff changeset
   477
    normally instead of transplanting them.
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   478
11193
687c7d395f20 Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents: 10510
diff changeset
   479
    If no merges or revisions are provided, :hg:`transplant` will
687c7d395f20 Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents: 10510
diff changeset
   480
    start an interactive changeset browser.
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   481
8000
83d7c9cfb065 transplant: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7874
diff changeset
   482
    If a changeset application fails, you can fix the merge by hand
11193
687c7d395f20 Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents: 10510
diff changeset
   483
    and then resume where you left off by calling :hg:`transplant
687c7d395f20 Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents: 10510
diff changeset
   484
    --continue/-c`.
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   485
    '''
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   486
    def getremotechanges(repo, url):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   487
        sourcerepo = ui.expandpath(url)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   488
        source = hg.repository(ui, sourcerepo)
11301
3d0591a66118 move discovery methods from localrepo into new discovery module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11193
diff changeset
   489
        tmp = discovery.findcommonincoming(repo, source, force=True)
3d0591a66118 move discovery methods from localrepo into new discovery module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11193
diff changeset
   490
        common, incoming, rheads = tmp
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   491
        if not incoming:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   492
            return (source, None, None)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   493
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   494
        bundle = None
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   495
        if not source.local():
7415
6163ef936a00 protocol: use changegroupsubset() if possible (issue1389)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7369
diff changeset
   496
            if source.capable('changegroupsubset'):
6163ef936a00 protocol: use changegroupsubset() if possible (issue1389)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7369
diff changeset
   497
                cg = source.changegroupsubset(incoming, rheads, 'incoming')
6163ef936a00 protocol: use changegroupsubset() if possible (issue1389)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7369
diff changeset
   498
            else:
6163ef936a00 protocol: use changegroupsubset() if possible (issue1389)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7369
diff changeset
   499
                cg = source.changegroup(incoming, 'incoming')
4049
863465381028 transplant: update to current writebundle API
Brendan Cully <brendan@kublai.com>
parents: 4035
diff changeset
   500
            bundle = changegroup.writebundle(cg, None, 'HG10UN')
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   501
            source = bundlerepo.bundlerepository(ui, repo.root, bundle)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   502
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   503
        return (source, incoming, bundle)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   504
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   505
    def incwalk(repo, incoming, branches, match=util.always):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   506
        if not branches:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   507
            branches = None
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   508
        for node in repo.changelog.nodesbetween(incoming, branches)[0]:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   509
            if match(node):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   510
                yield node
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   511
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   512
    def transplantwalk(repo, root, branches, match=util.always):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   513
        if not branches:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   514
            branches = repo.heads()
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   515
        ancestors = []
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   516
        for branch in branches:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   517
            ancestors.append(repo.changelog.ancestor(root, branch))
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   518
        for node in repo.changelog.nodesbetween(ancestors, branches)[0]:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   519
            if match(node):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   520
                yield node
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   521
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   522
    def checkopts(opts, revs):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   523
        if opts.get('continue'):
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   524
            if opts.get('branch') or opts.get('all') or opts.get('merge'):
7744
b44dbb95f07f transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents: 7633
diff changeset
   525
                raise util.Abort(_('--continue is incompatible with '
b44dbb95f07f transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents: 7633
diff changeset
   526
                                   'branch, all or merge'))
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   527
            return
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   528
        if not (opts.get('source') or revs or
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   529
                opts.get('merge') or opts.get('branch')):
7744
b44dbb95f07f transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents: 7633
diff changeset
   530
            raise util.Abort(_('no source URL, branch tag or revision '
b44dbb95f07f transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents: 7633
diff changeset
   531
                               'list provided'))
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   532
        if opts.get('all'):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   533
            if not opts.get('branch'):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   534
                raise util.Abort(_('--all requires a branch revision'))
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   535
            if revs:
7744
b44dbb95f07f transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents: 7633
diff changeset
   536
                raise util.Abort(_('--all is incompatible with a '
b44dbb95f07f transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents: 7633
diff changeset
   537
                                   'revision list'))
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   538
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   539
    checkopts(opts, revs)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   540
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   541
    if not opts.get('log'):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   542
        opts['log'] = ui.config('transplant', 'log')
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   543
    if not opts.get('filter'):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   544
        opts['filter'] = ui.config('transplant', 'filter')
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   545
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   546
    tp = transplanter(ui, repo)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   547
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   548
    p1, p2 = repo.dirstate.parents()
8176
2660e7002413 transplant: forbid transplant to nonempty repositories with no working directory.
Brendan Cully <brendan@kublai.com>
parents: 8173
diff changeset
   549
    if len(repo) > 0 and p1 == revlog.nullid:
2660e7002413 transplant: forbid transplant to nonempty repositories with no working directory.
Brendan Cully <brendan@kublai.com>
parents: 8173
diff changeset
   550
        raise util.Abort(_('no revision checked out'))
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   551
    if not opts.get('continue'):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   552
        if p2 != revlog.nullid:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   553
            raise util.Abort(_('outstanding uncommitted merges'))
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   554
        m, a, r, d = repo.status()[:4]
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   555
        if m or a or r or d:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   556
            raise util.Abort(_('outstanding local changes'))
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   557
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   558
    bundle = None
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   559
    source = opts.get('source')
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   560
    if source:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   561
        (source, incoming, bundle) = getremotechanges(repo, source)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   562
    else:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   563
        source = repo
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   564
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   565
    try:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   566
        if opts.get('continue'):
3724
ea523d6f5f1a transplant: fix --continue; add --continue test
Brendan Cully <brendan@kublai.com>
parents: 3723
diff changeset
   567
            tp.resume(repo, source, opts)
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   568
            return
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   569
10394
4612cded5176 fix coding style (reported by pylint)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10282
diff changeset
   570
        tf = tp.transplantfilter(repo, source, p1)
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   571
        if opts.get('prune'):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   572
            prune = [source.lookup(r)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   573
                     for r in cmdutil.revrange(source, opts.get('prune'))]
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   574
            matchfn = lambda x: tf(x) and x not in prune
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   575
        else:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   576
            matchfn = tf
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   577
        branches = map(source.lookup, opts.get('branch', ()))
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   578
        merges = map(source.lookup, opts.get('merge', ()))
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   579
        revmap = {}
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   580
        if revs:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   581
            for r in cmdutil.revrange(source, revs):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   582
                revmap[int(r)] = source.lookup(r)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   583
        elif opts.get('all') or not merges:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   584
            if source != repo:
7744
b44dbb95f07f transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents: 7633
diff changeset
   585
                alltransplants = incwalk(source, incoming, branches,
b44dbb95f07f transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents: 7633
diff changeset
   586
                                         match=matchfn)
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   587
            else:
7744
b44dbb95f07f transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents: 7633
diff changeset
   588
                alltransplants = transplantwalk(source, p1, branches,
b44dbb95f07f transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents: 7633
diff changeset
   589
                                                match=matchfn)
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   590
            if opts.get('all'):
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   591
                revs = alltransplants
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   592
            else:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   593
                revs, newmerges = browserevs(ui, source, alltransplants, opts)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   594
                merges.extend(newmerges)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   595
            for r in revs:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   596
                revmap[source.changelog.rev(r)] = r
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   597
        for r in merges:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   598
            revmap[source.changelog.rev(r)] = r
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   599
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   600
        tp.apply(repo, source, revmap, merges, opts)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   601
    finally:
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   602
        if bundle:
12347
6277a9469dff bundlerepo: restore close() method
Matt Mackall <mpm@selenic.com>
parents: 12331
diff changeset
   603
            source.close()
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   604
            os.unlink(bundle)
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   605
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   606
cmdtable = {
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   607
    "transplant":
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   608
        (transplant,
11321
40c06bbf58be help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 11301
diff changeset
   609
         [('s', 'source', '',
40c06bbf58be help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 11301
diff changeset
   610
           _('pull patches from REPO'), _('REPO')),
40c06bbf58be help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 11301
diff changeset
   611
          ('b', 'branch', [],
40c06bbf58be help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 11301
diff changeset
   612
           _('pull patches from branch BRANCH'), _('BRANCH')),
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   613
          ('a', 'all', None, _('pull all changesets up to BRANCH')),
11321
40c06bbf58be help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 11301
diff changeset
   614
          ('p', 'prune', [],
40c06bbf58be help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 11301
diff changeset
   615
           _('skip over REV'), _('REV')),
40c06bbf58be help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 11301
diff changeset
   616
          ('m', 'merge', [],
40c06bbf58be help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 11301
diff changeset
   617
           _('merge at REV'), _('REV')),
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   618
          ('', 'log', None, _('append transplant info to log message')),
7744
b44dbb95f07f transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents: 7633
diff changeset
   619
          ('c', 'continue', None, _('continue last transplant session '
b44dbb95f07f transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents: 7633
diff changeset
   620
                                    'after repair')),
11321
40c06bbf58be help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 11301
diff changeset
   621
          ('', 'filter', '',
40c06bbf58be help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 11301
diff changeset
   622
           _('filter changesets through command'), _('CMD'))],
40c06bbf58be help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 11301
diff changeset
   623
         _('hg transplant [-s REPO] [-b BRANCH [-a]] [-p REV] '
7744
b44dbb95f07f transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents: 7633
diff changeset
   624
           '[-m REV] [REV]...'))
3714
198173f3957c Add transplant extension
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   625
}