hgext/mq.py
author Brendan Cully <brendan@kublai.com>
Mon, 14 Aug 2006 11:24:19 -0700
changeset 2904 57b88b86a845
parent 2883 c2932ad5476a
child 2905 790fd342b6c7
permissions -rw-r--r--
Replace qdel/qfold -f option with -k/--keep.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
     1
# queue.py - patch queues for mercurial
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
     2
#
2859
345bac2bc4ec update copyrights.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2856
diff changeset
     3
# Copyright 2005, 2006 Chris Mason <mason@suse.com>
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
     4
#
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
     5
# This software may be used and distributed according to the terms
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
     6
# of the GNU General Public License, incorporated herein by reference.
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
     7
2554
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
     8
'''patch management and development
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
     9
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    10
This extension lets you work with a stack of patches in a Mercurial
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    11
repository.  It manages two stacks of patches - all known patches, and
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    12
applied patches (subset of known patches).
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    13
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    14
Known patches are represented as patch files in the .hg/patches
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    15
directory.  Applied patches are both patch files and changesets.
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    16
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    17
Common tasks (use "hg help command" for more details):
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    18
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    19
prepare repository to work with patches   qinit
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    20
create new patch                          qnew
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    21
import existing patch                     qimport
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    22
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    23
print patch series                        qseries
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    24
print applied patches                     qapplied
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    25
print name of top applied patch           qtop
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    26
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    27
add known patch to applied stack          qpush
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    28
remove patch from applied stack           qpop
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    29
refresh contents of top applied patch     qrefresh
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    30
'''
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    31
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    32
from mercurial.demandload import *
2867
b5f56d6c62c4 mq: demandload more
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
    33
from mercurial.i18n import gettext as _
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    34
demandload(globals(), "os sys re struct traceback errno bz2")
2883
c2932ad5476a move commands.addremove_lock to cmdutil.addremove
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2875
diff changeset
    35
demandload(globals(), "mercurial:cmdutil,commands,hg,patch,revlog,ui,util")
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    36
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
    37
commands.norepo += " qclone qversion"
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
    38
2818
bdc067ff6cf5 Make mq camelcase consistent with the rest of hg.
Brendan Cully <brendan@kublai.com>
parents: 2816
diff changeset
    39
class statusentry:
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
    40
    def __init__(self, rev, name=None):
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
    41
        if not name:
2816
52516e48e3f3 Update qsave to use StatusEntry; don't throw exception on bad status lines.
Brendan Cully <brendan@kublai.com>
parents: 2804
diff changeset
    42
            fields = rev.split(':')
52516e48e3f3 Update qsave to use StatusEntry; don't throw exception on bad status lines.
Brendan Cully <brendan@kublai.com>
parents: 2804
diff changeset
    43
            if len(fields) == 2:
52516e48e3f3 Update qsave to use StatusEntry; don't throw exception on bad status lines.
Brendan Cully <brendan@kublai.com>
parents: 2804
diff changeset
    44
                self.rev, self.name = fields
52516e48e3f3 Update qsave to use StatusEntry; don't throw exception on bad status lines.
Brendan Cully <brendan@kublai.com>
parents: 2804
diff changeset
    45
            else:
52516e48e3f3 Update qsave to use StatusEntry; don't throw exception on bad status lines.
Brendan Cully <brendan@kublai.com>
parents: 2804
diff changeset
    46
                self.rev, self.name = None, None
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
    47
        else:
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
    48
            self.rev, self.name = rev, name
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
    49
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
    50
    def __str__(self):
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
    51
        return self.rev + ':' + self.name
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
    52
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    53
class queue:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    54
    def __init__(self, ui, path, patchdir=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    55
        self.basepath = path
2819
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
    56
        self.path = patchdir or os.path.join(path, "patches")
1852
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
    57
        self.opener = util.opener(self.path)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    58
        self.ui = ui
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    59
        self.applied = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    60
        self.full_series = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    61
        self.applied_dirty = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    62
        self.series_dirty = 0
1852
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
    63
        self.series_path = "series"
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
    64
        self.status_path = "status"
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
    65
        self.guards_path = "guards"
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
    66
        self.active_guards = None
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
    67
        self.guards_dirty = False
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
    68
        self._diffopts = None
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
    69
2819
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
    70
        if os.path.exists(self.join(self.series_path)):
1852
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
    71
            self.full_series = self.opener(self.series_path).read().splitlines()
2767
60683ab1ed33 mq: rename read_series as parse_series, make simpler and faster
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2766
diff changeset
    72
        self.parse_series()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    73
2819
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
    74
        if os.path.exists(self.join(self.status_path)):
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
    75
            lines = self.opener(self.status_path).read().splitlines()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
    76
            self.applied = [statusentry(l) for l in lines]
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    77
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
    78
    def diffopts(self):
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
    79
        if self._diffopts is None:
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
    80
            self._diffopts = self.ui.diffopts()
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
    81
        return self._diffopts
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
    82
2819
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
    83
    def join(self, *p):
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
    84
        return os.path.join(self.path, *p)
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
    85
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    86
    def find_series(self, patch):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    87
        pre = re.compile("(\s*)([^#]+)")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    88
        index = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    89
        for l in self.full_series:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    90
            m = pre.match(l)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    91
            if m:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    92
                s = m.group(2)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    93
                s = s.rstrip()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    94
                if s == patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    95
                    return index
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    96
            index += 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    97
        return None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    98
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
    99
    guard_re = re.compile(r'\s?#([-+][^-+# \t\r\n\f][^# \t\r\n\f]*)')
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   100
2767
60683ab1ed33 mq: rename read_series as parse_series, make simpler and faster
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2766
diff changeset
   101
    def parse_series(self):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   102
        self.series = []
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   103
        self.series_guards = []
2767
60683ab1ed33 mq: rename read_series as parse_series, make simpler and faster
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2766
diff changeset
   104
        for l in self.full_series:
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   105
            h = l.find('#')
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   106
            if h == -1:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   107
                patch = l
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   108
                comment = ''
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   109
            elif h == 0:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   110
                continue
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   111
            else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   112
                patch = l[:h]
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   113
                comment = l[h:]
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   114
            patch = patch.strip()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   115
            if patch:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   116
                self.series.append(patch)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   117
                self.series_guards.append(self.guard_re.findall(comment))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   118
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   119
    def check_guard(self, guard):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   120
        bad_chars = '# \t\r\n\f'
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   121
        first = guard[0]
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   122
        for c in '-+':
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   123
            if first == c:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   124
                return (_('guard %r starts with invalid character: %r') %
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   125
                        (guard, c))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   126
        for c in bad_chars:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   127
            if c in guard:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   128
                return _('invalid character in guard %r: %r') % (guard, c)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   129
        
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   130
    def set_active(self, guards):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   131
        for guard in guards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   132
            bad = self.check_guard(guard)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   133
            if bad:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   134
                raise util.Abort(bad)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   135
        guards = dict.fromkeys(guards).keys()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   136
        guards.sort()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   137
        self.ui.debug('active guards: %s\n' % ' '.join(guards))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   138
        self.active_guards = guards
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   139
        self.guards_dirty = True
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   140
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   141
    def active(self):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   142
        if self.active_guards is None:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   143
            self.active_guards = []
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   144
            try:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   145
                guards = self.opener(self.guards_path).read().split()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   146
            except IOError, err:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   147
                if err.errno != errno.ENOENT: raise
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   148
                guards = []
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   149
            for i, guard in enumerate(guards):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   150
                bad = self.check_guard(guard)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   151
                if bad:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   152
                    self.ui.warn('%s:%d: %s\n' %
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   153
                                 (self.join(self.guards_path), i + 1, bad))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   154
                else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   155
                    self.active_guards.append(guard)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   156
        return self.active_guards
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   157
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   158
    def set_guards(self, idx, guards):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   159
        for g in guards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   160
            if len(g) < 2:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   161
                raise util.Abort(_('guard %r too short') % g)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   162
            if g[0] not in '-+':
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   163
                raise util.Abort(_('guard %r starts with invalid char') % g)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   164
            bad = self.check_guard(g[1:])
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   165
            if bad:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   166
                raise util.Abort(bad)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   167
        drop = self.guard_re.sub('', self.full_series[idx])
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   168
        self.full_series[idx] = drop + ''.join([' #' + g for g in guards])
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   169
        self.parse_series()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   170
        self.series_dirty = True
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   171
        
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   172
    def pushable(self, idx):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   173
        if isinstance(idx, str):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   174
            idx = self.series.index(idx)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   175
        patchguards = self.series_guards[idx]
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   176
        if not patchguards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   177
            return True, None
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   178
        default = False
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   179
        guards = self.active()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   180
        exactneg = [g for g in patchguards if g[0] == '-' and g[1:] in guards]
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   181
        if exactneg:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   182
            return False, exactneg[0]
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   183
        pos = [g for g in patchguards if g[0] == '+']
2850
851b07ec450c mq: apply patch is any posative guard matches
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2848
diff changeset
   184
        exactpos = [g for g in pos if g[1:] in guards]
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   185
        if pos:
2850
851b07ec450c mq: apply patch is any posative guard matches
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2848
diff changeset
   186
            if exactpos:
851b07ec450c mq: apply patch is any posative guard matches
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2848
diff changeset
   187
                return True, exactpos[0]
851b07ec450c mq: apply patch is any posative guard matches
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2848
diff changeset
   188
            return False, pos
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   189
        return True, ''
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   190
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   191
    def explain_pushable(self, idx, all_patches=False):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   192
        write = all_patches and self.ui.write or self.ui.warn
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   193
        if all_patches or self.ui.verbose:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   194
            if isinstance(idx, str):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   195
                idx = self.series.index(idx)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   196
            pushable, why = self.pushable(idx)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   197
            if all_patches and pushable:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   198
                if why is None:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   199
                    write(_('allowing %s - no guards in effect\n') %
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   200
                          self.series[idx])
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   201
                else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   202
                    if not why:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   203
                        write(_('allowing %s - no matching negative guards\n') %
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   204
                              self.series[idx])
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   205
                    else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   206
                        write(_('allowing %s - guarded by %r\n') %
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   207
                              (self.series[idx], why))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   208
            if not pushable:
2829
05316bb57d01 mq: make guards more strict, add tests
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2828
diff changeset
   209
                if why:
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   210
                    write(_('skipping %s - guarded by %r\n') %
2829
05316bb57d01 mq: make guards more strict, add tests
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2828
diff changeset
   211
                          (self.series[idx], ' '.join(why)))
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   212
                else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   213
                    write(_('skipping %s - no matching guards\n') %
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   214
                          self.series[idx])
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   215
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   216
    def save_dirty(self):
2772
4720e79486d3 mq: simplify save_dirty
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2771
diff changeset
   217
        def write_list(items, path):
4720e79486d3 mq: simplify save_dirty
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2771
diff changeset
   218
            fp = self.opener(path, 'w')
4720e79486d3 mq: simplify save_dirty
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2771
diff changeset
   219
            for i in items:
4720e79486d3 mq: simplify save_dirty
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2771
diff changeset
   220
                print >> fp, i
4720e79486d3 mq: simplify save_dirty
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2771
diff changeset
   221
            fp.close()
2781
ae726521717c merge with brendan.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2780 2779
diff changeset
   222
        if self.applied_dirty: write_list(map(str, self.applied), self.status_path)
2772
4720e79486d3 mq: simplify save_dirty
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2771
diff changeset
   223
        if self.series_dirty: write_list(self.full_series, self.series_path)
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   224
        if self.guards_dirty: write_list(self.active_guards, self.guards_path)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   225
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   226
    def readheaders(self, patch):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   227
        def eatdiff(lines):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   228
            while lines:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   229
                l = lines[-1]
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   230
                if (l.startswith("diff -") or
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   231
                    l.startswith("Index:") or
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   232
                    l.startswith("===========")):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   233
                    del lines[-1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   234
                else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   235
                    break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   236
        def eatempty(lines):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   237
            while lines:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   238
                l = lines[-1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   239
                if re.match('\s*$', l):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   240
                    del lines[-1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   241
                else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   242
                    break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   243
2819
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
   244
        pf = self.join(patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   245
        message = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   246
        comments = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   247
        user = None
2299
dacf718e1d48 Add timestamp field to export format. Make import and mq use it.
Danek Duvall <danek.duvall@sun.com>
parents: 2270
diff changeset
   248
        date = None
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   249
        format = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   250
        subject = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   251
        diffstart = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   252
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   253
        for line in file(pf):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   254
            line = line.rstrip()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   255
            if diffstart:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   256
                if line.startswith('+++ '):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   257
                    diffstart = 2
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   258
                break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   259
            if line.startswith("--- "):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   260
                diffstart = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   261
                continue
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   262
            elif format == "hgpatch":
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   263
                # parse values when importing the result of an hg export
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   264
                if line.startswith("# User "):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   265
                    user = line[7:]
2300
52b9b6751b2c Use "# Date" instead of "# Timestamp" for dated export/import of patches.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2299
diff changeset
   266
                elif line.startswith("# Date "):
52b9b6751b2c Use "# Date" instead of "# Timestamp" for dated export/import of patches.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2299
diff changeset
   267
                    date = line[7:]
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   268
                elif not line.startswith("# ") and line:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   269
                    message.append(line)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   270
                    format = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   271
            elif line == '# HG changeset patch':
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   272
                format = "hgpatch"
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   273
            elif (format != "tagdone" and (line.startswith("Subject: ") or
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   274
                                           line.startswith("subject: "))):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   275
                subject = line[9:]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   276
                format = "tag"
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   277
            elif (format != "tagdone" and (line.startswith("From: ") or
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   278
                                           line.startswith("from: "))):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   279
                user = line[6:]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   280
                format = "tag"
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   281
            elif format == "tag" and line == "":
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   282
                # when looking for tags (subject: from: etc) they
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   283
                # end once you find a blank line in the source
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   284
                format = "tagdone"
2301
7c2623aedeb4 Strip empty lines and trailing spaces around commit messages.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2300
diff changeset
   285
            elif message or line:
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   286
                message.append(line)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   287
            comments.append(line)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   288
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   289
        eatdiff(message)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   290
        eatdiff(comments)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   291
        eatempty(message)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   292
        eatempty(comments)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   293
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   294
        # make sure message isn't empty
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   295
        if format and format.startswith("tag") and subject:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   296
            message.insert(0, "")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   297
            message.insert(0, subject)
2299
dacf718e1d48 Add timestamp field to export format. Make import and mq use it.
Danek Duvall <danek.duvall@sun.com>
parents: 2270
diff changeset
   298
        return (message, comments, user, date, diffstart > 1)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   299
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
   300
    def printdiff(self, repo, node1, node2=None, files=None,
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
   301
                  fp=None, changes=None, opts=None):
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
   302
        patch.diff(repo, node1, node2, files,
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
   303
                   fp=fp, changes=changes, opts=self.diffopts())
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
   304
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   305
    def mergeone(self, repo, mergeq, head, patch, rev, wlock):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   306
        # first try just applying the patch
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   307
        (err, n) = self.apply(repo, [ patch ], update_status=False,
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   308
                              strict=True, merge=rev, wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   309
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   310
        if err == 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   311
            return (err, n)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   312
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   313
        if n is None:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
   314
            raise util.Abort(_("apply failed for patch %s") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   315
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   316
        self.ui.warn("patch didn't work out, merging %s\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   317
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   318
        # apply failed, strip away that rev and merge.
2808
30f59f4a327e Introduce update helper functions: update, merge, clean, and revert
Matt Mackall <mpm@selenic.com>
parents: 2804
diff changeset
   319
        hg.clean(repo, head, wlock=wlock)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   320
        self.strip(repo, n, update=False, backup='strip', wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   321
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   322
        c = repo.changelog.read(rev)
2808
30f59f4a327e Introduce update helper functions: update, merge, clean, and revert
Matt Mackall <mpm@selenic.com>
parents: 2804
diff changeset
   323
        ret = hg.merge(repo, rev, wlock=wlock)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   324
        if ret:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
   325
            raise util.Abort(_("update returned %d") % ret)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   326
        n = repo.commit(None, c[4], c[1], force=1, wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   327
        if n == None:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
   328
            raise util.Abort(_("repo commit failed"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   329
        try:
2299
dacf718e1d48 Add timestamp field to export format. Make import and mq use it.
Danek Duvall <danek.duvall@sun.com>
parents: 2270
diff changeset
   330
            message, comments, user, date, patchfound = mergeq.readheaders(patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   331
        except:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
   332
            raise util.Abort(_("unable to read %s") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   333
1852
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
   334
        patchf = self.opener(patch, "w")
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   335
        if comments:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   336
            comments = "\n".join(comments) + '\n\n'
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   337
            patchf.write(comments)
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
   338
        self.printdiff(repo, head, n, fp=patchf)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   339
        patchf.close()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   340
        return (0, n)
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   341
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   342
    def qparents(self, repo, rev=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   343
        if rev is None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   344
            (p1, p2) = repo.dirstate.parents()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   345
            if p2 == revlog.nullid:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   346
                return p1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   347
            if len(self.applied) == 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   348
                return None
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
   349
            return revlog.bin(self.applied[-1].rev)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   350
        pp = repo.changelog.parents(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   351
        if pp[1] != revlog.nullid:
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
   352
            arevs = [ x.rev for x in self.applied ]
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   353
            p0 = revlog.hex(pp[0])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   354
            p1 = revlog.hex(pp[1])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   355
            if p0 in arevs:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   356
                return pp[0]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   357
            if p1 in arevs:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   358
                return pp[1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   359
        return pp[0]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   360
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   361
    def mergepatch(self, repo, mergeq, series, wlock):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   362
        if len(self.applied) == 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   363
            # each of the patches merged in will have two parents.  This
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   364
            # can confuse the qrefresh, qdiff, and strip code because it
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   365
            # needs to know which parent is actually in the patch queue.
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   366
            # so, we insert a merge marker with only one parent.  This way
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   367
            # the first patch in the queue is never a merge patch
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   368
            #
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   369
            pname = ".hg.patches.merge.marker"
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   370
            n = repo.commit(None, '[mq]: merge marker', user=None, force=1,
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   371
                            wlock=wlock)
2818
bdc067ff6cf5 Make mq camelcase consistent with the rest of hg.
Brendan Cully <brendan@kublai.com>
parents: 2816
diff changeset
   372
            self.applied.append(statusentry(revlog.hex(n), pname))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   373
            self.applied_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   374
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   375
        head = self.qparents(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   376
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   377
        for patch in series:
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   378
            patch = mergeq.lookup(patch, strict=True)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   379
            if not patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   380
                self.ui.warn("patch %s does not exist\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   381
                return (1, None)
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   382
            pushable, reason = self.pushable(patch)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   383
            if not pushable:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   384
                self.explain_pushable(patch, all_patches=True)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   385
                continue
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   386
            info = mergeq.isapplied(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   387
            if not info:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   388
                self.ui.warn("patch %s is not applied\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   389
                return (1, None)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   390
            rev = revlog.bin(info[1])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   391
            (err, head) = self.mergeone(repo, mergeq, head, patch, rev, wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   392
            if head:
2818
bdc067ff6cf5 Make mq camelcase consistent with the rest of hg.
Brendan Cully <brendan@kublai.com>
parents: 2816
diff changeset
   393
                self.applied.append(statusentry(revlog.hex(head), patch))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   394
                self.applied_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   395
            if err:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   396
                return (err, head)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   397
        return (0, head)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   398
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   399
    def patch(self, repo, patchfile):
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   400
        '''Apply patchfile  to the working directory.
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   401
        patchfile: file name of patch'''
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   402
        try:
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   403
            pp = util.find_in_path('gpatch', os.environ.get('PATH', ''), 'patch')
2791
f4d916351366 Add portable shell-quoting function; teach mq to use it.
Brendan Cully <brendan@kublai.com>
parents: 2781
diff changeset
   404
            f = os.popen("%s -d %s -p1 --no-backup-if-mismatch < %s" %
f4d916351366 Add portable shell-quoting function; teach mq to use it.
Brendan Cully <brendan@kublai.com>
parents: 2781
diff changeset
   405
                         (pp, util.shellquote(repo.root), util.shellquote(patchfile)))
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   406
        except:
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   407
            self.ui.warn("patch failed, unable to continue (try -v)\n")
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   408
            return (None, [], False)
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   409
        files = []
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   410
        fuzz = False
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   411
        for l in f:
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   412
            l = l.rstrip('\r\n');
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   413
            if self.ui.verbose:
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   414
                self.ui.warn(l + "\n")
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   415
            if l[:14] == 'patching file ':
2792
8ec1b1f0a5f7 mq: use more portable util.parse_patch_output instead of handrolled version.
Brendan Cully <brendan@kublai.com>
parents: 2791
diff changeset
   416
                pf = os.path.normpath(util.parse_patch_output(l))
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   417
                if pf not in files:
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   418
                    files.append(pf)
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   419
                printed_file = False
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   420
                file_str = l
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   421
            elif l.find('with fuzz') >= 0:
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   422
                if not printed_file:
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   423
                    self.ui.warn(file_str + '\n')
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   424
                    printed_file = True
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   425
                self.ui.warn(l + '\n')
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   426
                fuzz = True
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   427
            elif l.find('saving rejects to file') >= 0:
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   428
                self.ui.warn(l + '\n')
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   429
            elif l.find('FAILED') >= 0:
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   430
                if not printed_file:
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   431
                    self.ui.warn(file_str + '\n')
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   432
                    printed_file = True
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   433
                self.ui.warn(l + '\n')
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   434
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   435
        return (not f.close(), files, fuzz)
2796
4c39568007f9 mq: codingstyle
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2795
diff changeset
   436
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   437
    def apply(self, repo, series, list=False, update_status=True,
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   438
              strict=False, patchdir=None, merge=None, wlock=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   439
        # TODO unify with commands.py
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   440
        if not patchdir:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   441
            patchdir = self.path
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   442
        err = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   443
        if not wlock:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   444
            wlock = repo.wlock()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   445
        lock = repo.lock()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   446
        tr = repo.transaction()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   447
        n = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   448
        for patch in series:
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   449
            pushable, reason = self.pushable(patch)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   450
            if not pushable:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   451
                self.explain_pushable(patch, all_patches=True)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   452
                continue
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   453
            self.ui.warn("applying %s\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   454
            pf = os.path.join(patchdir, patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   455
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   456
            try:
2299
dacf718e1d48 Add timestamp field to export format. Make import and mq use it.
Danek Duvall <danek.duvall@sun.com>
parents: 2270
diff changeset
   457
                message, comments, user, date, patchfound = self.readheaders(patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   458
            except:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   459
                self.ui.warn("Unable to read %s\n" % pf)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   460
                err = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   461
                break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   462
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   463
            if not message:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   464
                message = "imported patch %s\n" % patch
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   465
            else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   466
                if list:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   467
                    message.append("\nimported patch %s" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   468
                message = '\n'.join(message)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   469
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   470
            (patcherr, files, fuzz) = self.patch(repo, pf)
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   471
            patcherr = not patcherr
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   472
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   473
            if merge and len(files) > 0:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   474
                # Mark as merged and update dirstate parent info
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   475
                repo.dirstate.update(repo.dirstate.filterfiles(files), 'm')
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   476
                p1, p2 = repo.dirstate.parents()
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   477
                repo.dirstate.setparents(p1, merge)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   478
            if len(files) > 0:
2728
5d134f04060f mq: allow to apply patches in subdir of repo again
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2725
diff changeset
   479
                cwd = repo.getcwd()
5d134f04060f mq: allow to apply patches in subdir of repo again
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2725
diff changeset
   480
                cfiles = files
5d134f04060f mq: allow to apply patches in subdir of repo again
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2725
diff changeset
   481
                if cwd:
5d134f04060f mq: allow to apply patches in subdir of repo again
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2725
diff changeset
   482
                    cfiles = [util.pathto(cwd, f) for f in files]
2883
c2932ad5476a move commands.addremove_lock to cmdutil.addremove
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2875
diff changeset
   483
                cmdutil.addremove(repo, cfiles, wlock=wlock)
2299
dacf718e1d48 Add timestamp field to export format. Make import and mq use it.
Danek Duvall <danek.duvall@sun.com>
parents: 2270
diff changeset
   484
            n = repo.commit(files, message, user, date, force=1, lock=lock,
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   485
                            wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   486
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   487
            if n == None:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
   488
                raise util.Abort(_("repo commit failed"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   489
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   490
            if update_status:
2818
bdc067ff6cf5 Make mq camelcase consistent with the rest of hg.
Brendan Cully <brendan@kublai.com>
parents: 2816
diff changeset
   491
                self.applied.append(statusentry(revlog.hex(n), patch))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   492
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   493
            if patcherr:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   494
                if not patchfound:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   495
                    self.ui.warn("patch %s is empty\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   496
                    err = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   497
                else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   498
                    self.ui.warn("patch failed, rejects left in working dir\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   499
                    err = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   500
                break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   501
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   502
            if fuzz and strict:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   503
                self.ui.warn("fuzz found when applying patch, stopping\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   504
                err = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   505
                break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   506
        tr.close()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   507
        return (err, n)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   508
2904
57b88b86a845 Replace qdel/qfold -f option with -k/--keep.
Brendan Cully <brendan@kublai.com>
parents: 2883
diff changeset
   509
    def delete(self, repo, patch, keep=False):
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   510
        patch = self.lookup(patch, strict=True)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   511
        info = self.isapplied(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   512
        if info:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
   513
            raise util.Abort(_("cannot delete applied patch %s") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   514
        if patch not in self.series:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
   515
            raise util.Abort(_("patch %s not in series file") % patch)
2904
57b88b86a845 Replace qdel/qfold -f option with -k/--keep.
Brendan Cully <brendan@kublai.com>
parents: 2883
diff changeset
   516
        if not keep:
2752
5dfeda163bb7 Add -f option to qdelete, to remove patch file.
Brendan Cully <brendan@kublai.com>
parents: 2751
diff changeset
   517
            r = self.qrepo()
5dfeda163bb7 Add -f option to qdelete, to remove patch file.
Brendan Cully <brendan@kublai.com>
parents: 2751
diff changeset
   518
            if r:
5dfeda163bb7 Add -f option to qdelete, to remove patch file.
Brendan Cully <brendan@kublai.com>
parents: 2751
diff changeset
   519
                r.remove([patch], True)
5dfeda163bb7 Add -f option to qdelete, to remove patch file.
Brendan Cully <brendan@kublai.com>
parents: 2751
diff changeset
   520
            else:
2819
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
   521
                os.unlink(self.join(patch))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   522
        i = self.find_series(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   523
        del self.full_series[i]
2767
60683ab1ed33 mq: rename read_series as parse_series, make simpler and faster
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2766
diff changeset
   524
        self.parse_series()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   525
        self.series_dirty = 1
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   526
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   527
    def check_toppatch(self, repo):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   528
        if len(self.applied) > 0:
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
   529
            top = revlog.bin(self.applied[-1].rev)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   530
            pp = repo.dirstate.parents()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   531
            if top not in pp:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
   532
                raise util.Abort(_("queue top not at same revision as working directory"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   533
            return top
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   534
        return None
2875
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
   535
    def check_localchanges(self, repo, force=False, refresh=True):
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
   536
        m, a, r, d = repo.status()[:4]
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
   537
        if m or a or r or d:
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
   538
            if not force:
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
   539
                if refresh:
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
   540
                    raise util.Abort(_("local changes found, refresh first"))
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
   541
                else:
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
   542
                    raise util.Abort(_("local changes found"))
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
   543
        return m, a, r, d
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   544
    def new(self, repo, patch, msg=None, force=None):
2819
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
   545
        if os.path.exists(self.join(patch)):
2711
ca97be5babf8 mq: do not allow to qnew a patch twice
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2699
diff changeset
   546
            raise util.Abort(_('patch "%s" already exists') % patch)
2875
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
   547
        m, a, r, d = self.check_localchanges(repo, force)
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
   548
        commitfiles = m + a + r
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   549
        self.check_toppatch(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   550
        wlock = repo.wlock()
2698
c1123e83c8e2 mq: fix qnew and qimport to deal with series file comments
Chris Mason <mason@suse.com>
parents: 2697
diff changeset
   551
        insert = self.full_series_end()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   552
        if msg:
2511
041d8f0a8437 mq: hg qnew -f should refresh the new patch
Chris Mason <mason@suse.com>
parents: 2488
diff changeset
   553
            n = repo.commit(commitfiles, "[mq]: %s" % msg, force=True,
041d8f0a8437 mq: hg qnew -f should refresh the new patch
Chris Mason <mason@suse.com>
parents: 2488
diff changeset
   554
                            wlock=wlock)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   555
        else:
2511
041d8f0a8437 mq: hg qnew -f should refresh the new patch
Chris Mason <mason@suse.com>
parents: 2488
diff changeset
   556
            n = repo.commit(commitfiles,
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   557
                            "New patch: %s" % patch, force=True, wlock=wlock)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   558
        if n == None:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
   559
            raise util.Abort(_("repo commit failed"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   560
        self.full_series[insert:insert] = [patch]
2818
bdc067ff6cf5 Make mq camelcase consistent with the rest of hg.
Brendan Cully <brendan@kublai.com>
parents: 2816
diff changeset
   561
        self.applied.append(statusentry(revlog.hex(n), patch))
2767
60683ab1ed33 mq: rename read_series as parse_series, make simpler and faster
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2766
diff changeset
   562
        self.parse_series()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   563
        self.series_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   564
        self.applied_dirty = 1
1852
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
   565
        p = self.opener(patch, "w")
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   566
        if msg:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   567
            msg = msg + "\n"
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   568
            p.write(msg)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   569
        p.close()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   570
        wlock = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   571
        r = self.qrepo()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   572
        if r: r.add([patch])
2511
041d8f0a8437 mq: hg qnew -f should refresh the new patch
Chris Mason <mason@suse.com>
parents: 2488
diff changeset
   573
        if commitfiles:
2856
a3c73c9679d2 Fix "hg qnew -f foo" without -m
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 2855
diff changeset
   574
            self.refresh(repo, short=True)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   575
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   576
    def strip(self, repo, rev, update=True, backup="all", wlock=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   577
        def limitheads(chlog, stop):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   578
            """return the list of all nodes that have no children"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   579
            p = {}
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   580
            h = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   581
            stoprev = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   582
            if stop in chlog.nodemap:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   583
                stoprev = chlog.rev(stop)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   584
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   585
            for r in range(chlog.count() - 1, -1, -1):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   586
                n = chlog.node(r)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   587
                if n not in p:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   588
                    h.append(n)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   589
                if n == stop:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   590
                    break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   591
                if r < stoprev:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   592
                    break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   593
                for pn in chlog.parents(n):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   594
                    p[pn] = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   595
            return h
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   596
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   597
        def bundle(cg):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   598
            backupdir = repo.join("strip-backup")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   599
            if not os.path.isdir(backupdir):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   600
                os.mkdir(backupdir)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   601
            name = os.path.join(backupdir, "%s" % revlog.short(rev))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   602
            name = savename(name)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   603
            self.ui.warn("saving bundle to %s\n" % name)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   604
            # TODO, exclusive open
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   605
            f = open(name, "wb")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   606
            try:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   607
                f.write("HG10")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   608
                z = bz2.BZ2Compressor(9)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   609
                while 1:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   610
                    chunk = cg.read(4096)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   611
                    if not chunk:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   612
                        break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   613
                    f.write(z.compress(chunk))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   614
                f.write(z.flush())
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   615
            except:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   616
                os.unlink(name)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   617
                raise
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   618
            f.close()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   619
            return name
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   620
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   621
        def stripall(rev, revnum):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   622
            cl = repo.changelog
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   623
            c = cl.read(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   624
            mm = repo.manifest.read(c[0])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   625
            seen = {}
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   626
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   627
            for x in xrange(revnum, cl.count()):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   628
                c = cl.read(cl.node(x))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   629
                for f in c[3]:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   630
                    if f in seen:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   631
                        continue
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   632
                    seen[f] = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   633
                    if f in mm:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   634
                        filerev = mm[f]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   635
                    else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   636
                        filerev = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   637
                    seen[f] = filerev
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   638
            # we go in two steps here so the strip loop happens in a
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   639
            # sensible order.  When stripping many files, this helps keep
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   640
            # our disk access patterns under control.
2794
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
   641
            seen_list = seen.keys()
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
   642
            seen_list.sort()
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
   643
            for f in seen_list:
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   644
                ff = repo.file(f)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   645
                filerev = seen[f]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   646
                if filerev != 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   647
                    if filerev in ff.nodemap:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   648
                        filerev = ff.rev(filerev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   649
                    else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   650
                        filerev = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   651
                ff.strip(filerev, revnum)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   652
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   653
        if not wlock:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   654
            wlock = repo.wlock()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   655
        lock = repo.lock()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   656
        chlog = repo.changelog
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   657
        # TODO delete the undo files, and handle undo of merge sets
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   658
        pp = chlog.parents(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   659
        revnum = chlog.rev(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   660
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   661
        if update:
2875
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
   662
            self.check_localchanges(repo, refresh=False)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   663
            urev = self.qparents(repo, rev)
2808
30f59f4a327e Introduce update helper functions: update, merge, clean, and revert
Matt Mackall <mpm@selenic.com>
parents: 2804
diff changeset
   664
            hg.clean(repo, urev, wlock=wlock)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   665
            repo.dirstate.write()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   666
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   667
        # save is a list of all the branches we are truncating away
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   668
        # that we actually want to keep.  changegroup will be used
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   669
        # to preserve them and add them back after the truncate
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   670
        saveheads = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   671
        savebases = {}
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   672
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   673
        heads = limitheads(chlog, rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   674
        seen = {}
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   675
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   676
        # search through all the heads, finding those where the revision
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   677
        # we want to strip away is an ancestor.  Also look for merges
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   678
        # that might be turned into new heads by the strip.
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   679
        while heads:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   680
            h = heads.pop()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   681
            n = h
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   682
            while True:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   683
                seen[n] = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   684
                pp = chlog.parents(n)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   685
                if pp[1] != revlog.nullid and chlog.rev(pp[1]) > revnum:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   686
                    if pp[1] not in seen:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   687
                        heads.append(pp[1])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   688
                if pp[0] == revlog.nullid:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   689
                    break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   690
                if chlog.rev(pp[0]) < revnum:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   691
                    break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   692
                n = pp[0]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   693
                if n == rev:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   694
                    break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   695
            r = chlog.reachable(h, rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   696
            if rev not in r:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   697
                saveheads.append(h)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   698
                for x in r:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   699
                    if chlog.rev(x) > revnum:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   700
                        savebases[x] = 1
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   701
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   702
        # create a changegroup for all the branches we need to keep
2797
a3c6e7888abf mq: unused variables, improper usage of 'is [not]', undefined variable
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2796
diff changeset
   703
        if backup == "all":
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   704
            backupch = repo.changegroupsubset([rev], chlog.heads(), 'strip')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   705
            bundle(backupch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   706
        if saveheads:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   707
            backupch = repo.changegroupsubset(savebases.keys(), saveheads, 'strip')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   708
            chgrpfile = bundle(backupch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   709
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   710
        stripall(rev, revnum)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   711
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   712
        change = chlog.read(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   713
        repo.manifest.strip(repo.manifest.rev(change[0]), revnum)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   714
        chlog.strip(revnum, revnum)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   715
        if saveheads:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   716
            self.ui.status("adding branch\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   717
            commands.unbundle(self.ui, repo, chgrpfile, update=False)
2797
a3c6e7888abf mq: unused variables, improper usage of 'is [not]', undefined variable
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2796
diff changeset
   718
            if backup != "strip":
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   719
                os.unlink(chgrpfile)
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   720
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   721
    def isapplied(self, patch):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   722
        """returns (index, rev, patch)"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   723
        for i in xrange(len(self.applied)):
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
   724
            a = self.applied[i]
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
   725
            if a.name == patch:
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
   726
                return (i, a.rev, a.name)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   727
        return None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   728
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   729
    # if the exact patch name does not exist, we try a few 
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   730
    # variations.  If strict is passed, we try only #1
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   731
    #
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   732
    # 1) a number to indicate an offset in the series file
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   733
    # 2) a unique substring of the patch name was given
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   734
    # 3) patchname[-+]num to indicate an offset in the series file
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   735
    def lookup(self, patch, strict=False):
2844
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
   736
        patch = patch and str(patch)
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
   737
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   738
        def partial_name(s):
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   739
            if s in self.series:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   740
                return s
2765
0327bd1c831c mq: print matches if patch name not unique
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2757
diff changeset
   741
            matches = [x for x in self.series if s in x]
0327bd1c831c mq: print matches if patch name not unique
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2757
diff changeset
   742
            if len(matches) > 1:
0327bd1c831c mq: print matches if patch name not unique
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2757
diff changeset
   743
                self.ui.warn(_('patch name "%s" is ambiguous:\n') % s)
0327bd1c831c mq: print matches if patch name not unique
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2757
diff changeset
   744
                for m in matches:
0327bd1c831c mq: print matches if patch name not unique
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2757
diff changeset
   745
                    self.ui.warn('  %s\n' % m)
0327bd1c831c mq: print matches if patch name not unique
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2757
diff changeset
   746
                return None
0327bd1c831c mq: print matches if patch name not unique
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2757
diff changeset
   747
            if matches:
0327bd1c831c mq: print matches if patch name not unique
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2757
diff changeset
   748
                return matches[0]
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   749
            if len(self.series) > 0 and len(self.applied) > 0:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   750
                if s == 'qtip':
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   751
                    return self.series[self.series_end()-1]
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   752
                if s == 'qbase':
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   753
                    return self.series[0]
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   754
            return None
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   755
        if patch == None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   756
            return None
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   757
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   758
        # we don't want to return a partial match until we make
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   759
        # sure the file name passed in does not exist (checked below)
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   760
        res = partial_name(patch)
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   761
        if res and res == patch:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   762
            return res
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   763
2819
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
   764
        if not os.path.isfile(self.join(patch)):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   765
            try:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   766
                sno = int(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   767
            except(ValueError, OverflowError):
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   768
                pass
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   769
            else:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   770
                if sno < len(self.series):
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   771
                    return self.series[sno]
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   772
            if not strict:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   773
                # return any partial match made above
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   774
                if res:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   775
                    return res
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   776
                minus = patch.rsplit('-', 1)
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   777
                if len(minus) > 1:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   778
                    res = partial_name(minus[0])
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   779
                    if res:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   780
                        i = self.series.index(res)
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   781
                        try:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   782
                            off = int(minus[1] or 1)
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   783
                        except(ValueError, OverflowError):
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   784
                            pass
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   785
                        else:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   786
                            if i - off >= 0:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   787
                                return self.series[i - off]
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   788
                plus = patch.rsplit('+', 1)
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   789
                if len(plus) > 1:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   790
                    res = partial_name(plus[0])
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   791
                    if res:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   792
                        i = self.series.index(res)
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   793
                        try:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   794
                            off = int(plus[1] or 1)
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   795
                        except(ValueError, OverflowError):
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   796
                            pass
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   797
                        else:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   798
                            if i + off < len(self.series):
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   799
                                return self.series[i + off]
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
   800
        raise util.Abort(_("patch %s not in series") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   801
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   802
    def push(self, repo, patch=None, force=False, list=False,
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   803
             mergeq=None, wlock=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   804
        if not wlock:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   805
            wlock = repo.wlock()
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   806
        patch = self.lookup(patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   807
        if patch and self.isapplied(patch):
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
   808
            self.ui.warn(_("patch %s is already applied\n") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   809
            sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   810
        if self.series_end() == len(self.series):
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
   811
            self.ui.warn(_("patch series fully applied\n"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   812
            sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   813
        if not force:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   814
            self.check_localchanges(repo)
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   815
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   816
        self.applied_dirty = 1;
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   817
        start = self.series_end()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   818
        if start > 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   819
            self.check_toppatch(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   820
        if not patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   821
            patch = self.series[start]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   822
            end = start + 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   823
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   824
            end = self.series.index(patch, start) + 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   825
        s = self.series[start:end]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   826
        if mergeq:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   827
            ret = self.mergepatch(repo, mergeq, s, wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   828
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   829
            ret = self.apply(repo, s, list, wlock=wlock)
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
   830
        top = self.applied[-1].name
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   831
        if ret[0]:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   832
            self.ui.write("Errors during apply, please fix and refresh %s\n" %
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   833
                          top)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   834
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   835
            self.ui.write("Now at: %s\n" % top)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   836
        return ret[0]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   837
2697
6c540dd14c38 mq: qpop should act like quilt pop
Chris Mason <mason@suse.com>
parents: 2696
diff changeset
   838
    def pop(self, repo, patch=None, force=False, update=True, all=False,
6c540dd14c38 mq: qpop should act like quilt pop
Chris Mason <mason@suse.com>
parents: 2696
diff changeset
   839
            wlock=None):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   840
        def getfile(f, rev):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   841
            t = repo.file(f).read(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   842
            try:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   843
                repo.wfile(f, "w").write(t)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   844
            except IOError:
2086
8742352db413 mq: do not fail if directory to create exists
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2047
diff changeset
   845
                try:
8742352db413 mq: do not fail if directory to create exists
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2047
diff changeset
   846
                    os.makedirs(os.path.dirname(repo.wjoin(f)))
8742352db413 mq: do not fail if directory to create exists
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2047
diff changeset
   847
                except OSError, err:
8742352db413 mq: do not fail if directory to create exists
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2047
diff changeset
   848
                    if err.errno != errno.EEXIST: raise
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   849
                repo.wfile(f, "w").write(t)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   850
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   851
        if not wlock:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   852
            wlock = repo.wlock()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   853
        if patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   854
            # index, rev, patch
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   855
            info = self.isapplied(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   856
            if not info:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   857
                patch = self.lookup(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   858
            info = self.isapplied(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   859
            if not info:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
   860
                raise util.Abort(_("patch %s is not applied") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   861
        if len(self.applied) == 0:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
   862
            self.ui.warn(_("no patches applied\n"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   863
            sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   864
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   865
        if not update:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   866
            parents = repo.dirstate.parents()
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
   867
            rr = [ revlog.bin(x.rev) for x in self.applied ]
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   868
            for p in parents:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   869
                if p in rr:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   870
                    self.ui.warn("qpop: forcing dirstate update\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   871
                    update = True
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   872
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   873
        if not force and update:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   874
            self.check_localchanges(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   875
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   876
        self.applied_dirty = 1;
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   877
        end = len(self.applied)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   878
        if not patch:
2697
6c540dd14c38 mq: qpop should act like quilt pop
Chris Mason <mason@suse.com>
parents: 2696
diff changeset
   879
            if all:
6c540dd14c38 mq: qpop should act like quilt pop
Chris Mason <mason@suse.com>
parents: 2696
diff changeset
   880
                popi = 0
6c540dd14c38 mq: qpop should act like quilt pop
Chris Mason <mason@suse.com>
parents: 2696
diff changeset
   881
            else:
6c540dd14c38 mq: qpop should act like quilt pop
Chris Mason <mason@suse.com>
parents: 2696
diff changeset
   882
                popi = len(self.applied) - 1
6c540dd14c38 mq: qpop should act like quilt pop
Chris Mason <mason@suse.com>
parents: 2696
diff changeset
   883
        else:
6c540dd14c38 mq: qpop should act like quilt pop
Chris Mason <mason@suse.com>
parents: 2696
diff changeset
   884
            popi = info[0] + 1
6c540dd14c38 mq: qpop should act like quilt pop
Chris Mason <mason@suse.com>
parents: 2696
diff changeset
   885
            if popi >= end:
6c540dd14c38 mq: qpop should act like quilt pop
Chris Mason <mason@suse.com>
parents: 2696
diff changeset
   886
                self.ui.warn("qpop: %s is already at the top\n" % patch)
6c540dd14c38 mq: qpop should act like quilt pop
Chris Mason <mason@suse.com>
parents: 2696
diff changeset
   887
                return
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
   888
        info = [ popi ] + [self.applied[popi].rev, self.applied[popi].name]
2697
6c540dd14c38 mq: qpop should act like quilt pop
Chris Mason <mason@suse.com>
parents: 2696
diff changeset
   889
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   890
        start = info[0]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   891
        rev = revlog.bin(info[1])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   892
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   893
        # we know there are no local changes, so we can make a simplified
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   894
        # form of hg.update.
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   895
        if update:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   896
            top = self.check_toppatch(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   897
            qp = self.qparents(repo, rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   898
            changes = repo.changelog.read(qp)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   899
            mmap = repo.manifest.read(changes[0])
2875
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
   900
            m, a, r, d, u = repo.status(qp, top)[:5]
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   901
            if d:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   902
                raise util.Abort("deletions found between repo revs")
2875
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
   903
            for f in m:
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   904
                getfile(f, mmap[f])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   905
            for f in r:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   906
                getfile(f, mmap[f])
2872
d36af1f10fdf manifest.execf is now a function.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2840
diff changeset
   907
                util.set_exec(repo.wjoin(f), mmap.execf(f))
2875
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
   908
            repo.dirstate.update(m + r, 'n')
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   909
            for f in a:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   910
                try: os.unlink(repo.wjoin(f))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   911
                except: raise
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   912
                try: os.removedirs(os.path.dirname(repo.wjoin(f)))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   913
                except: pass
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   914
            if a:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   915
                repo.dirstate.forget(a)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   916
            repo.dirstate.setparents(qp, revlog.nullid)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   917
        self.strip(repo, rev, update=False, backup='strip', wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   918
        del self.applied[start:end]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   919
        if len(self.applied):
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
   920
            self.ui.write("Now at: %s\n" % self.applied[-1].name)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   921
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   922
            self.ui.write("Patch queue now empty\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   923
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   924
    def diff(self, repo, files):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   925
        top = self.check_toppatch(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   926
        if not top:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   927
            self.ui.write("No patches applied\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   928
            return
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   929
        qp = self.qparents(repo, top)
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
   930
        self.printdiff(repo, qp, files=files)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   931
2856
a3c73c9679d2 Fix "hg qnew -f foo" without -m
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 2855
diff changeset
   932
    def refresh(self, repo, msg='', short=False):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   933
        if len(self.applied) == 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   934
            self.ui.write("No patches applied\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   935
            return
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   936
        wlock = repo.wlock()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   937
        self.check_toppatch(repo)
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
   938
        (top, patch) = (self.applied[-1].rev, self.applied[-1].name)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   939
        top = revlog.bin(top)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   940
        cparents = repo.changelog.parents(top)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   941
        patchparent = self.qparents(repo, top)
2299
dacf718e1d48 Add timestamp field to export format. Make import and mq use it.
Danek Duvall <danek.duvall@sun.com>
parents: 2270
diff changeset
   942
        message, comments, user, date, patchfound = self.readheaders(patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   943
1852
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
   944
        patchf = self.opener(patch, "w")
2745
1bac2bfe081a Change patch header as well as commit message with qrefresh -m or -l.
Brendan Cully <brendan@kublai.com>
parents: 2742
diff changeset
   945
        msg = msg.rstrip()
1bac2bfe081a Change patch header as well as commit message with qrefresh -m or -l.
Brendan Cully <brendan@kublai.com>
parents: 2742
diff changeset
   946
        if msg:
1bac2bfe081a Change patch header as well as commit message with qrefresh -m or -l.
Brendan Cully <brendan@kublai.com>
parents: 2742
diff changeset
   947
            if comments:
1bac2bfe081a Change patch header as well as commit message with qrefresh -m or -l.
Brendan Cully <brendan@kublai.com>
parents: 2742
diff changeset
   948
                # Remove existing message.
1bac2bfe081a Change patch header as well as commit message with qrefresh -m or -l.
Brendan Cully <brendan@kublai.com>
parents: 2742
diff changeset
   949
                ci = 0
1bac2bfe081a Change patch header as well as commit message with qrefresh -m or -l.
Brendan Cully <brendan@kublai.com>
parents: 2742
diff changeset
   950
                for mi in range(len(message)):
1bac2bfe081a Change patch header as well as commit message with qrefresh -m or -l.
Brendan Cully <brendan@kublai.com>
parents: 2742
diff changeset
   951
                    while message[mi] != comments[ci]:
1bac2bfe081a Change patch header as well as commit message with qrefresh -m or -l.
Brendan Cully <brendan@kublai.com>
parents: 2742
diff changeset
   952
                        ci += 1
1bac2bfe081a Change patch header as well as commit message with qrefresh -m or -l.
Brendan Cully <brendan@kublai.com>
parents: 2742
diff changeset
   953
                    del comments[ci]
1bac2bfe081a Change patch header as well as commit message with qrefresh -m or -l.
Brendan Cully <brendan@kublai.com>
parents: 2742
diff changeset
   954
            comments.append(msg)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   955
        if comments:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   956
            comments = "\n".join(comments) + '\n\n'
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   957
            patchf.write(comments)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   958
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   959
        tip = repo.changelog.tip()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   960
        if top == tip:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   961
            # if the top of our patch queue is also the tip, there is an
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   962
            # optimization here.  We update the dirstate in place and strip
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   963
            # off the tip commit.  Then just commit the current directory
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   964
            # tree.  We can also send repo.commit the list of files
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   965
            # changed to speed up the diff
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   966
            #
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   967
            # in short mode, we only diff the files included in the
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   968
            # patch already
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   969
            #
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   970
            # this should really read:
2875
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
   971
            #   mm, dd, aa, aa2, uu = repo.status(tip, patchparent)[:5]
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   972
            # but we do it backwards to take advantage of manifest/chlog
2875
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
   973
            # caching against the next repo.status call
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   974
            #
2875
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
   975
            mm, aa, dd, aa2, uu = repo.status(patchparent, tip)[:5]
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   976
            if short:
2875
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
   977
                filelist = mm + aa + dd
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   978
            else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   979
                filelist = None
2875
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
   980
            m, a, r, d, u = repo.status(files=filelist)[:5]
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   981
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   982
            # we might end up with files that were added between tip and
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   983
            # the dirstate parent, but then changed in the local dirstate.
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   984
            # in this case, we want them to only show up in the added section
2875
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
   985
            for x in m:
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   986
                if x not in aa:
2875
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
   987
                    mm.append(x)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   988
            # we might end up with files added by the local dirstate that
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   989
            # were deleted by the patch.  In this case, they should only
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   990
            # show up in the changed section.
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   991
            for x in a:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   992
                if x in dd:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   993
                    del dd[dd.index(x)]
2875
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
   994
                    mm.append(x)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   995
                else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   996
                    aa.append(x)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   997
            # make sure any files deleted in the local dirstate
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   998
            # are not in the add or change column of the patch
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   999
            forget = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1000
            for x in d + r:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1001
                if x in aa:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1002
                    del aa[aa.index(x)]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1003
                    forget.append(x)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1004
                    continue
2875
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
  1005
                elif x in mm:
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
  1006
                    del mm[mm.index(x)]
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1007
                dd.append(x)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1008
2875
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
  1009
            m = list(util.unique(mm))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1010
            r = list(util.unique(dd))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1011
            a = list(util.unique(aa))
2875
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
  1012
            filelist = list(util.unique(m + r + a))
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
  1013
            self.printdiff(repo, patchparent, files=filelist,
2875
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
  1014
                           changes=(m, a, r, [], u), fp=patchf)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1015
            patchf.close()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1016
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1017
            changes = repo.changelog.read(tip)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1018
            repo.dirstate.setparents(*cparents)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1019
            repo.dirstate.update(a, 'a')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1020
            repo.dirstate.update(r, 'r')
2875
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
  1021
            repo.dirstate.update(m, 'n')
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1022
            repo.dirstate.forget(forget)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1023
2694
0fb28dbf0dc7 MQ: uniformise message and logfile option.
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2682
diff changeset
  1024
            if not msg:
0fb28dbf0dc7 MQ: uniformise message and logfile option.
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2682
diff changeset
  1025
                if not message:
0fb28dbf0dc7 MQ: uniformise message and logfile option.
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2682
diff changeset
  1026
                    message = "patch queue: %s\n" % patch
0fb28dbf0dc7 MQ: uniformise message and logfile option.
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2682
diff changeset
  1027
                else:
0fb28dbf0dc7 MQ: uniformise message and logfile option.
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2682
diff changeset
  1028
                    message = "\n".join(message)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1029
            else:
2694
0fb28dbf0dc7 MQ: uniformise message and logfile option.
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2682
diff changeset
  1030
                message = msg
0fb28dbf0dc7 MQ: uniformise message and logfile option.
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2682
diff changeset
  1031
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1032
            self.strip(repo, top, update=False, backup='strip', wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1033
            n = repo.commit(filelist, message, changes[1], force=1, wlock=wlock)
2818
bdc067ff6cf5 Make mq camelcase consistent with the rest of hg.
Brendan Cully <brendan@kublai.com>
parents: 2816
diff changeset
  1034
            self.applied[-1] = statusentry(revlog.hex(n), patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1035
            self.applied_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1036
        else:
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
  1037
            self.printdiff(repo, patchparent, fp=patchf)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1038
            patchf.close()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1039
            self.pop(repo, force=True, wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1040
            self.push(repo, force=True, wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1041
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1042
    def init(self, repo, create=False):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1043
        if os.path.isdir(self.path):
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
  1044
            raise util.Abort(_("patch queue directory already exists"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1045
        os.mkdir(self.path)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1046
        if create:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1047
            return self.qrepo(create=True)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1048
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1049
    def unapplied(self, repo, patch=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1050
        if patch and patch not in self.series:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
  1051
            raise util.Abort(_("patch %s is not in series file") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1052
        if not patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1053
            start = self.series_end()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1054
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1055
            start = self.series.index(patch) + 1
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1056
        unapplied = []
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1057
        for i in xrange(start, len(self.series)):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1058
            pushable, reason = self.pushable(i)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1059
            if pushable:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1060
                unapplied.append((i, self.series[i]))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1061
            self.explain_pushable(i)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1062
        return unapplied
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1063
2756
caa6d992608b Add -s option to qseries: display first line of patch header.
Brendan Cully <brendan@kublai.com>
parents: 2754
diff changeset
  1064
    def qseries(self, repo, missing=None, summary=False):
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1065
        start = self.series_end(all_patches=True)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1066
        if not missing:
2756
caa6d992608b Add -s option to qseries: display first line of patch header.
Brendan Cully <brendan@kublai.com>
parents: 2754
diff changeset
  1067
            for i in range(len(self.series)):
caa6d992608b Add -s option to qseries: display first line of patch header.
Brendan Cully <brendan@kublai.com>
parents: 2754
diff changeset
  1068
                patch = self.series[i]
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1069
                if self.ui.verbose:
2756
caa6d992608b Add -s option to qseries: display first line of patch header.
Brendan Cully <brendan@kublai.com>
parents: 2754
diff changeset
  1070
                    if i < start:
caa6d992608b Add -s option to qseries: display first line of patch header.
Brendan Cully <brendan@kublai.com>
parents: 2754
diff changeset
  1071
                        status = 'A'
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1072
                    elif self.pushable(i)[0]:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1073
                        status = 'U'
2756
caa6d992608b Add -s option to qseries: display first line of patch header.
Brendan Cully <brendan@kublai.com>
parents: 2754
diff changeset
  1074
                    else:
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1075
                        status = 'G'
2756
caa6d992608b Add -s option to qseries: display first line of patch header.
Brendan Cully <brendan@kublai.com>
parents: 2754
diff changeset
  1076
                    self.ui.write('%d %s ' % (i, status))
caa6d992608b Add -s option to qseries: display first line of patch header.
Brendan Cully <brendan@kublai.com>
parents: 2754
diff changeset
  1077
                if summary:
caa6d992608b Add -s option to qseries: display first line of patch header.
Brendan Cully <brendan@kublai.com>
parents: 2754
diff changeset
  1078
                    msg = self.readheaders(patch)[0]
caa6d992608b Add -s option to qseries: display first line of patch header.
Brendan Cully <brendan@kublai.com>
parents: 2754
diff changeset
  1079
                    msg = msg and ': ' + msg[0] or ': '
caa6d992608b Add -s option to qseries: display first line of patch header.
Brendan Cully <brendan@kublai.com>
parents: 2754
diff changeset
  1080
                else:
caa6d992608b Add -s option to qseries: display first line of patch header.
Brendan Cully <brendan@kublai.com>
parents: 2754
diff changeset
  1081
                    msg = ''
caa6d992608b Add -s option to qseries: display first line of patch header.
Brendan Cully <brendan@kublai.com>
parents: 2754
diff changeset
  1082
                self.ui.write('%s%s\n' % (patch, msg))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1083
        else:
2794
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
  1084
            msng_list = []
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1085
            for root, dirs, files in os.walk(self.path):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1086
                d = root[len(self.path) + 1:]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1087
                for f in files:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1088
                    fl = os.path.join(d, f)
1852
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
  1089
                    if (fl not in self.series and
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
  1090
                        fl not in (self.status_path, self.series_path)
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
  1091
                        and not fl.startswith('.')):
2794
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
  1092
                        msng_list.append(fl)
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
  1093
            msng_list.sort()
2795
e5e23cae6e09 mq: remove unecessary test
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2794
diff changeset
  1094
            for x in msng_list:
e5e23cae6e09 mq: remove unecessary test
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2794
diff changeset
  1095
                if self.ui.verbose:
e5e23cae6e09 mq: remove unecessary test
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2794
diff changeset
  1096
                    self.ui.write("D ")
e5e23cae6e09 mq: remove unecessary test
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2794
diff changeset
  1097
                self.ui.write("%s\n" % x)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1098
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1099
    def issaveline(self, l):
2816
52516e48e3f3 Update qsave to use StatusEntry; don't throw exception on bad status lines.
Brendan Cully <brendan@kublai.com>
parents: 2804
diff changeset
  1100
        if l.name == '.hg.patches.save.line':
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1101
            return True
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1102
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1103
    def qrepo(self, create=False):
2819
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
  1104
        if create or os.path.isdir(self.join(".hg")):
1839
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1810
diff changeset
  1105
            return hg.repository(self.ui, path=self.path, create=create)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1106
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1107
    def restore(self, repo, rev, delete=None, qupdate=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1108
        c = repo.changelog.read(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1109
        desc = c[4].strip()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1110
        lines = desc.splitlines()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1111
        i = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1112
        datastart = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1113
        series = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1114
        applied = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1115
        qpp = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1116
        for i in xrange(0, len(lines)):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1117
            if lines[i] == 'Patch Data:':
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1118
                datastart = i + 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1119
            elif lines[i].startswith('Dirstate:'):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1120
                l = lines[i].rstrip()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1121
                l = l[10:].split(' ')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1122
                qpp = [ hg.bin(x) for x in l ]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1123
            elif datastart != None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1124
                l = lines[i].rstrip()
2818
bdc067ff6cf5 Make mq camelcase consistent with the rest of hg.
Brendan Cully <brendan@kublai.com>
parents: 2816
diff changeset
  1125
                se = statusentry(l)
2794
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
  1126
                file_ = se.name
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
  1127
                if se.rev:
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
  1128
                    applied.append(se)
2794
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
  1129
                series.append(file_)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1130
        if datastart == None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1131
            self.ui.warn("No saved patch data found\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1132
            return 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1133
        self.ui.warn("restoring status: %s\n" % lines[0])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1134
        self.full_series = series
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1135
        self.applied = applied
2767
60683ab1ed33 mq: rename read_series as parse_series, make simpler and faster
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2766
diff changeset
  1136
        self.parse_series()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1137
        self.series_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1138
        self.applied_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1139
        heads = repo.changelog.heads()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1140
        if delete:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1141
            if rev not in heads:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1142
                self.ui.warn("save entry has children, leaving it alone\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1143
            else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1144
                self.ui.warn("removing save entry %s\n" % hg.short(rev))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1145
                pp = repo.dirstate.parents()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1146
                if rev in pp:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1147
                    update = True
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1148
                else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1149
                    update = False
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1150
                self.strip(repo, rev, update=update, backup='strip')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1151
        if qpp:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1152
            self.ui.warn("saved queue repository parents: %s %s\n" %
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1153
                         (hg.short(qpp[0]), hg.short(qpp[1])))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1154
            if qupdate:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1155
                print "queue directory updating"
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1156
                r = self.qrepo()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1157
                if not r:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1158
                    self.ui.warn("Unable to load queue repository\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1159
                    return 1
2808
30f59f4a327e Introduce update helper functions: update, merge, clean, and revert
Matt Mackall <mpm@selenic.com>
parents: 2804
diff changeset
  1160
                hg.clean(r, qpp[0])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1161
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1162
    def save(self, repo, msg=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1163
        if len(self.applied) == 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1164
            self.ui.warn("save: no patches applied, exiting\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1165
            return 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1166
        if self.issaveline(self.applied[-1]):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1167
            self.ui.warn("status is already saved\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1168
            return 1
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1169
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1170
        ar = [ ':' + x for x in self.full_series ]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1171
        if not msg:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1172
            msg = "hg patches saved state"
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1173
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1174
            msg = "hg patches: " + msg.rstrip('\r\n')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1175
        r = self.qrepo()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1176
        if r:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1177
            pp = r.dirstate.parents()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1178
            msg += "\nDirstate: %s %s" % (hg.hex(pp[0]), hg.hex(pp[1]))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1179
        msg += "\n\nPatch Data:\n"
2816
52516e48e3f3 Update qsave to use StatusEntry; don't throw exception on bad status lines.
Brendan Cully <brendan@kublai.com>
parents: 2804
diff changeset
  1180
        text = msg + "\n".join([str(x) for x in self.applied]) + '\n' + (ar and
52516e48e3f3 Update qsave to use StatusEntry; don't throw exception on bad status lines.
Brendan Cully <brendan@kublai.com>
parents: 2804
diff changeset
  1181
                   "\n".join(ar) + '\n' or "")
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1182
        n = repo.commit(None, text, user=None, force=1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1183
        if not n:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1184
            self.ui.warn("repo commit failed\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1185
            return 1
2818
bdc067ff6cf5 Make mq camelcase consistent with the rest of hg.
Brendan Cully <brendan@kublai.com>
parents: 2816
diff changeset
  1186
        self.applied.append(statusentry(revlog.hex(n),'.hg.patches.save.line'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1187
        self.applied_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1188
2698
c1123e83c8e2 mq: fix qnew and qimport to deal with series file comments
Chris Mason <mason@suse.com>
parents: 2697
diff changeset
  1189
    def full_series_end(self):
c1123e83c8e2 mq: fix qnew and qimport to deal with series file comments
Chris Mason <mason@suse.com>
parents: 2697
diff changeset
  1190
        if len(self.applied) > 0:
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
  1191
            p = self.applied[-1].name
2698
c1123e83c8e2 mq: fix qnew and qimport to deal with series file comments
Chris Mason <mason@suse.com>
parents: 2697
diff changeset
  1192
            end = self.find_series(p)
c1123e83c8e2 mq: fix qnew and qimport to deal with series file comments
Chris Mason <mason@suse.com>
parents: 2697
diff changeset
  1193
            if end == None:
c1123e83c8e2 mq: fix qnew and qimport to deal with series file comments
Chris Mason <mason@suse.com>
parents: 2697
diff changeset
  1194
                return len(self.full_series)
c1123e83c8e2 mq: fix qnew and qimport to deal with series file comments
Chris Mason <mason@suse.com>
parents: 2697
diff changeset
  1195
            return end + 1
c1123e83c8e2 mq: fix qnew and qimport to deal with series file comments
Chris Mason <mason@suse.com>
parents: 2697
diff changeset
  1196
        return 0
c1123e83c8e2 mq: fix qnew and qimport to deal with series file comments
Chris Mason <mason@suse.com>
parents: 2697
diff changeset
  1197
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1198
    def series_end(self, all_patches=False):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1199
        end = 0
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1200
        def next(start):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1201
            if all_patches:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1202
                return start
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1203
            i = start
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1204
            while i < len(self.series):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1205
                p, reason = self.pushable(i)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1206
                if p:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1207
                    break
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1208
                self.explain_pushable(i)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1209
                i += 1
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1210
            return i
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1211
        if len(self.applied) > 0:
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
  1212
            p = self.applied[-1].name
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1213
            try:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1214
                end = self.series.index(p)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1215
            except ValueError:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1216
                return 0
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1217
            return next(end + 1)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1218
        return next(end)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1219
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1220
    def qapplied(self, repo, patch=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1221
        if patch and patch not in self.series:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
  1222
            raise util.Abort(_("patch %s is not in series file") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1223
        if not patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1224
            end = len(self.applied)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1225
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1226
            end = self.series.index(patch) + 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1227
        for x in xrange(end):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1228
            p = self.appliedname(x)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1229
            self.ui.write("%s\n" % p)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1230
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1231
    def appliedname(self, index):
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
  1232
        pname = self.applied[index].name
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1233
        if not self.ui.verbose:
2677
ec05ce9cbf47 mq: uniform verbose display of patche[s].
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2664
diff changeset
  1234
            p = pname
ec05ce9cbf47 mq: uniform verbose display of patche[s].
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2664
diff changeset
  1235
        else:
ec05ce9cbf47 mq: uniform verbose display of patche[s].
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2664
diff changeset
  1236
            p = str(self.series.index(pname)) + " " + p
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1237
        return p
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1238
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1239
    def top(self, repo):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1240
        if len(self.applied):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1241
            p = self.appliedname(-1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1242
            self.ui.write(p + '\n')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1243
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1244
            self.ui.write("No patches applied\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1245
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1246
    def next(self, repo):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1247
        end = self.series_end()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1248
        if end == len(self.series):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1249
            self.ui.write("All patches applied\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1250
        else:
2677
ec05ce9cbf47 mq: uniform verbose display of patche[s].
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2664
diff changeset
  1251
            p = self.series[end]
ec05ce9cbf47 mq: uniform verbose display of patche[s].
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2664
diff changeset
  1252
            if self.ui.verbose:
ec05ce9cbf47 mq: uniform verbose display of patche[s].
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2664
diff changeset
  1253
                self.ui.write("%d " % self.series.index(p))
ec05ce9cbf47 mq: uniform verbose display of patche[s].
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2664
diff changeset
  1254
            self.ui.write(p + '\n')
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1255
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1256
    def prev(self, repo):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1257
        if len(self.applied) > 1:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1258
            p = self.appliedname(-2)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1259
            self.ui.write(p + '\n')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1260
        elif len(self.applied) == 1:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1261
            self.ui.write("Only one patch applied\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1262
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1263
            self.ui.write("No patches applied\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1264
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1265
    def qimport(self, repo, files, patch=None, existing=None, force=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1266
        if len(files) > 1 and patch:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
  1267
            raise util.Abort(_('option "-n" not valid when importing multiple '
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
  1268
                               'files'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1269
        i = 0
2488
2785aeb51be4 mq: add qimported patches if patch dir is a repo
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2301
diff changeset
  1270
        added = []
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1271
        for filename in files:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1272
            if existing:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1273
                if not patch:
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1274
                    patch = filename
2819
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
  1275
                if not os.path.isfile(self.join(patch)):
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
  1276
                    raise util.Abort(_("patch %s does not exist") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1277
            else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1278
                try:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1279
                    text = file(filename).read()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1280
                except IOError:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
  1281
                    raise util.Abort(_("unable to read %s") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1282
                if not patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1283
                    patch = os.path.split(filename)[1]
2819
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
  1284
                if not force and os.path.exists(self.join(patch)):
2711
ca97be5babf8 mq: do not allow to qnew a patch twice
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2699
diff changeset
  1285
                    raise util.Abort(_('patch "%s" already exists') % patch)
1852
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
  1286
                patchf = self.opener(patch, "w")
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1287
                patchf.write(text)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1288
            if patch in self.series:
2711
ca97be5babf8 mq: do not allow to qnew a patch twice
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2699
diff changeset
  1289
                raise util.Abort(_('patch %s is already in the series file')
ca97be5babf8 mq: do not allow to qnew a patch twice
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2699
diff changeset
  1290
                                 % patch)
2698
c1123e83c8e2 mq: fix qnew and qimport to deal with series file comments
Chris Mason <mason@suse.com>
parents: 2697
diff changeset
  1291
            index = self.full_series_end() + i
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1292
            self.full_series[index:index] = [patch]
2767
60683ab1ed33 mq: rename read_series as parse_series, make simpler and faster
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2766
diff changeset
  1293
            self.parse_series()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1294
            self.ui.warn("adding %s to series file\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1295
            i += 1
2488
2785aeb51be4 mq: add qimported patches if patch dir is a repo
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2301
diff changeset
  1296
            added.append(patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1297
            patch = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1298
        self.series_dirty = 1
2488
2785aeb51be4 mq: add qimported patches if patch dir is a repo
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2301
diff changeset
  1299
        qrepo = self.qrepo()
2785aeb51be4 mq: add qimported patches if patch dir is a repo
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2301
diff changeset
  1300
        if qrepo:
2785aeb51be4 mq: add qimported patches if patch dir is a repo
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2301
diff changeset
  1301
            qrepo.add(added)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1302
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1303
def delete(ui, repo, patch, **opts):
2752
5dfeda163bb7 Add -f option to qdelete, to remove patch file.
Brendan Cully <brendan@kublai.com>
parents: 2751
diff changeset
  1304
    """remove a patch from the series file
5dfeda163bb7 Add -f option to qdelete, to remove patch file.
Brendan Cully <brendan@kublai.com>
parents: 2751
diff changeset
  1305
5dfeda163bb7 Add -f option to qdelete, to remove patch file.
Brendan Cully <brendan@kublai.com>
parents: 2751
diff changeset
  1306
    The patch must not be applied.
2904
57b88b86a845 Replace qdel/qfold -f option with -k/--keep.
Brendan Cully <brendan@kublai.com>
parents: 2883
diff changeset
  1307
    With -k, the patch file is preserved in the patch directory."""
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  1308
    q = repo.mq
2904
57b88b86a845 Replace qdel/qfold -f option with -k/--keep.
Brendan Cully <brendan@kublai.com>
parents: 2883
diff changeset
  1309
    q.delete(repo, patch, keep=opts.get('keep'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1310
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1311
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1312
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1313
def applied(ui, repo, patch=None, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1314
    """print the patches already applied"""
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  1315
    repo.mq.qapplied(repo, patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1316
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1317
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1318
def unapplied(ui, repo, patch=None, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1319
    """print the patches not yet applied"""
2779
663094f5595b mq: make queue.unapplied useful as api
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2772
diff changeset
  1320
    for i, p in repo.mq.unapplied(repo, patch):
663094f5595b mq: make queue.unapplied useful as api
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2772
diff changeset
  1321
        if ui.verbose:
663094f5595b mq: make queue.unapplied useful as api
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2772
diff changeset
  1322
            ui.write("%d " % i)
663094f5595b mq: make queue.unapplied useful as api
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2772
diff changeset
  1323
        ui.write("%s\n" % p)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1324
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1325
def qimport(ui, repo, *filename, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1326
    """import a patch"""
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  1327
    q = repo.mq
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1328
    q.qimport(repo, filename, patch=opts['name'],
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1329
              existing=opts['existing'], force=opts['force'])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1330
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1331
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1332
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1333
def init(ui, repo, **opts):
2754
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  1334
    """init a new queue repository
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  1335
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  1336
    The queue repository is unversioned by default. If -c is
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  1337
    specified, qinit will create a separate nested repository
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  1338
    for patches. Use qcommit to commit changes to this queue
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  1339
    repository."""
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  1340
    q = repo.mq
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1341
    r = q.init(repo, create=opts['create_repo'])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1342
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1343
    if r:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1344
        fp = r.wopener('.hgignore', 'w')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1345
        print >> fp, 'syntax: glob'
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1346
        print >> fp, 'status'
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1347
        fp.close()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1348
        r.wopener('series', 'w').close()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1349
        r.add(['.hgignore', 'series'])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1350
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1351
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1352
def clone(ui, source, dest=None, **opts):
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1353
    '''clone main and patch repository at same time
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1354
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1355
    If source is local, destination will have no patches applied.  If
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1356
    source is remote, this command can not check if patches are
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1357
    applied in source, so cannot guarantee that patches are not
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1358
    applied in destination.  If you clone remote repository, be sure
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1359
    before that it has no patches applied.
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1360
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1361
    Source patch repository is looked for in <src>/.hg/patches by
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1362
    default.  Use -p <url> to change.
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1363
    '''
2766
c5ac397f7671 fix call to commands.setremoteconfig
Bryan O'Sullivan <bos@serpentine.com>
parents: 2765
diff changeset
  1364
    commands.setremoteconfig(ui, opts)
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1365
    if dest is None:
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1366
        dest = hg.defaultdest(source)
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1367
    sr = hg.repository(ui, ui.expandpath(source))
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1368
    qbase, destrev = None, None
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1369
    if sr.local():
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1370
        reposetup(ui, sr)
2725
9ffee4f07323 mq: update to handle repomap not longer used
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2724
diff changeset
  1371
        if sr.mq.applied:
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
  1372
            qbase = revlog.bin(sr.mq.applied[0].rev)
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1373
            if not hg.islocal(dest):
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1374
                destrev = sr.parents(qbase)[0]
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1375
    ui.note(_('cloning main repo\n'))
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1376
    sr, dr = hg.clone(ui, sr, dest,
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1377
                      pull=opts['pull'],
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1378
                      rev=destrev,
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1379
                      update=False,
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1380
                      stream=opts['uncompressed'])
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1381
    ui.note(_('cloning patch repo\n'))
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1382
    spr, dpr = hg.clone(ui, opts['patches'] or (sr.url() + '/.hg/patches'),
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1383
                        dr.url() + '/.hg/patches',
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1384
                        pull=opts['pull'],
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1385
                        update=not opts['noupdate'],
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1386
                        stream=opts['uncompressed'])
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1387
    if dr.local():
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1388
        if qbase:
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1389
            ui.note(_('stripping applied patches from destination repo\n'))
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1390
            reposetup(ui, dr)
2725
9ffee4f07323 mq: update to handle repomap not longer used
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2724
diff changeset
  1391
            dr.mq.strip(dr, qbase, update=False, backup=None)
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1392
        if not opts['noupdate']:
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1393
            ui.note(_('updating destination repo\n'))
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents: 2772
diff changeset
  1394
            hg.update(dr, dr.changelog.tip())
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1395
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1396
def commit(ui, repo, *pats, **opts):
2526
37785f986260 mq: Added help for qcommit, consistently talk about queue repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2488
diff changeset
  1397
    """commit changes in the queue repository"""
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  1398
    q = repo.mq
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1399
    r = q.qrepo()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1400
    if not r: raise util.Abort('no queue repository')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1401
    commands.commit(r.ui, r, *pats, **opts)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1402
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1403
def series(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1404
    """print the entire series file"""
2756
caa6d992608b Add -s option to qseries: display first line of patch header.
Brendan Cully <brendan@kublai.com>
parents: 2754
diff changeset
  1405
    repo.mq.qseries(repo, missing=opts['missing'], summary=opts['summary'])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1406
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1407
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1408
def top(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1409
    """print the name of the current patch"""
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  1410
    repo.mq.top(repo)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1411
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1412
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1413
def next(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1414
    """print the name of the next patch"""
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  1415
    repo.mq.next(repo)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1416
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1417
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1418
def prev(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1419
    """print the name of the previous patch"""
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  1420
    repo.mq.prev(repo)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1421
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1422
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1423
def new(ui, repo, patch, **opts):
2754
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  1424
    """create a new patch
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  1425
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  1426
    qnew creates a new patch on top of the currently-applied patch
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  1427
    (if any). It will refuse to run if there are any outstanding
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  1428
    changes unless -f is specified, in which case the patch will
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  1429
    be initialised with them.
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  1430
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  1431
    -m or -l set the patch header as well as the commit message.
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  1432
    If neither is specified, the patch header is empty and the
2770
5f8259e4d292 Clean up qnew help text.
Brendan Cully <brendan@kublai.com>
parents: 2767
diff changeset
  1433
    commit message is 'New patch: PATCH'"""
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  1434
    q = repo.mq
2804
4b20daa25f15 Update mq to use new logmessage arglist from 2794:bd8a9a94139f
Brendan Cully <brendan@kublai.com>
parents: 2803
diff changeset
  1435
    message = commands.logmessage(opts)
2694
0fb28dbf0dc7 MQ: uniformise message and logfile option.
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2682
diff changeset
  1436
    q.new(repo, patch, msg=message, force=opts['force'])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1437
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1438
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1439
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1440
def refresh(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1441
    """update the current patch"""
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  1442
    q = repo.mq
2804
4b20daa25f15 Update mq to use new logmessage arglist from 2794:bd8a9a94139f
Brendan Cully <brendan@kublai.com>
parents: 2803
diff changeset
  1443
    message = commands.logmessage(opts)
2746
0503eb5c0a33 Add option -e/--edit to qrefresh, to edit the existing header.
Brendan Cully <brendan@kublai.com>
parents: 2745
diff changeset
  1444
    if opts['edit']:
0503eb5c0a33 Add option -e/--edit to qrefresh, to edit the existing header.
Brendan Cully <brendan@kublai.com>
parents: 2745
diff changeset
  1445
        if message:
0503eb5c0a33 Add option -e/--edit to qrefresh, to edit the existing header.
Brendan Cully <brendan@kublai.com>
parents: 2745
diff changeset
  1446
            raise util.Abort(_('option "-e" incompatible with "-m" or "-l"'))
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
  1447
        patch = q.applied[-1].name
2746
0503eb5c0a33 Add option -e/--edit to qrefresh, to edit the existing header.
Brendan Cully <brendan@kublai.com>
parents: 2745
diff changeset
  1448
        (message, comment, user, date, hasdiff) = q.readheaders(patch)
0503eb5c0a33 Add option -e/--edit to qrefresh, to edit the existing header.
Brendan Cully <brendan@kublai.com>
parents: 2745
diff changeset
  1449
        message = ui.edit('\n'.join(message), user or ui.username())
2694
0fb28dbf0dc7 MQ: uniformise message and logfile option.
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2682
diff changeset
  1450
    q.refresh(repo, msg=message, short=opts['short'])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1451
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1452
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1453
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1454
def diff(ui, repo, *files, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1455
    """diff of the current patch"""
2097
4d2c2597876f Fix hg qdiff <file>
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 2086
diff changeset
  1456
    # deep in the dirstate code, the walkhelper method wants a list, not a tuple
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  1457
    repo.mq.diff(repo, list(files))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1458
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1459
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1460
def fold(ui, repo, *files, **opts):
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1461
    """fold the named patches into the current patch
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1462
2771
519bf0cd28d2 Add -f option to qfold; improve qfold documentation.
Brendan Cully <brendan@kublai.com>
parents: 2770
diff changeset
  1463
    Patches must not yet be applied. Each patch will be successively
519bf0cd28d2 Add -f option to qfold; improve qfold documentation.
Brendan Cully <brendan@kublai.com>
parents: 2770
diff changeset
  1464
    applied to the current patch in the order given. If all the
519bf0cd28d2 Add -f option to qfold; improve qfold documentation.
Brendan Cully <brendan@kublai.com>
parents: 2770
diff changeset
  1465
    patches apply successfully, the current patch will be refreshed
519bf0cd28d2 Add -f option to qfold; improve qfold documentation.
Brendan Cully <brendan@kublai.com>
parents: 2770
diff changeset
  1466
    with the new cumulative patch, and the folded patches will
2904
57b88b86a845 Replace qdel/qfold -f option with -k/--keep.
Brendan Cully <brendan@kublai.com>
parents: 2883
diff changeset
  1467
    be deleted. With -k/--keep, the folded patch files will not
2771
519bf0cd28d2 Add -f option to qfold; improve qfold documentation.
Brendan Cully <brendan@kublai.com>
parents: 2770
diff changeset
  1468
    be removed afterwards.
519bf0cd28d2 Add -f option to qfold; improve qfold documentation.
Brendan Cully <brendan@kublai.com>
parents: 2770
diff changeset
  1469
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1470
    The header for each folded patch will be concatenated with
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1471
    the current patch header, separated by a line of '* * *'."""
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1472
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1473
    q = repo.mq
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1474
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1475
    if not files:
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1476
        raise util.Abort(_('qfold requires at least one patch name'))
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1477
    if not q.check_toppatch(repo):
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1478
        raise util.Abort(_('No patches applied\n'))
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1479
2804
4b20daa25f15 Update mq to use new logmessage arglist from 2794:bd8a9a94139f
Brendan Cully <brendan@kublai.com>
parents: 2803
diff changeset
  1480
    message = commands.logmessage(opts)
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1481
    if opts['edit']:
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1482
        if message:
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1483
            raise util.Abort(_('option "-e" incompatible with "-m" or "-l"'))
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1484
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1485
    parent = q.lookup('qtip')
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1486
    patches = []
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1487
    messages = []
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1488
    for f in files:
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1489
        patch = q.lookup(f)
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1490
        if patch in patches or patch == parent:
2797
a3c6e7888abf mq: unused variables, improper usage of 'is [not]', undefined variable
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2796
diff changeset
  1491
            ui.warn(_('Skipping already folded patch %s') % patch)
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1492
        if q.isapplied(patch):
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1493
            raise util.Abort(_('qfold cannot fold already applied patch %s') % patch)
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1494
        patches.append(patch)
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1495
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1496
    for patch in patches:
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1497
        if not message:
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1498
            messages.append(q.readheaders(patch)[0])
2819
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
  1499
        pf = q.join(patch)
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1500
        (patchsuccess, files, fuzz) = q.patch(repo, pf)
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1501
        if not patchsuccess:
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1502
            raise util.Abort(_('Error folding patch %s') % patch)
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1503
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1504
    if not message:
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1505
        message, comments, user = q.readheaders(parent)[0:3]
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1506
        for msg in messages:
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1507
            message.append('* * *')
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1508
            message.extend(msg)
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1509
        message = '\n'.join(message)
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1510
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1511
    if opts['edit']:
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1512
        message = ui.edit(message, user or ui.username())
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1513
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1514
    q.refresh(repo, msg=message)
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1515
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1516
    for patch in patches:
2904
57b88b86a845 Replace qdel/qfold -f option with -k/--keep.
Brendan Cully <brendan@kublai.com>
parents: 2883
diff changeset
  1517
        q.delete(repo, patch, keep=opts['keep'])
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1518
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1519
    q.save_dirty()
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1520
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1521
def guard(ui, repo, *args, **opts):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1522
    '''set or print guards for a patch
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1523
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1524
    guards control whether a patch can be pushed.  a patch with no
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1525
    guards is aways pushed.  a patch with posative guard ("+foo") is
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1526
    pushed only if qselect command enables guard "foo".  a patch with
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1527
    nagative guard ("-foo") is never pushed if qselect command enables
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1528
    guard "foo".
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1529
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1530
    with no arguments, default is to print current active guards.
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1531
    with arguments, set active guards for patch.
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1532
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1533
    to set nagative guard "-foo" on topmost patch ("--" is needed so
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1534
    hg will not interpret "-foo" as argument):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1535
      hg qguard -- -foo
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1536
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1537
    to set guards on other patch:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1538
      hg qguard other.patch +2.6.17 -stable    
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1539
    '''
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1540
    def status(idx):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1541
        guards = q.series_guards[idx] or ['unguarded']
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1542
        ui.write('%s: %s\n' % (q.series[idx], ' '.join(guards)))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1543
    q = repo.mq
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1544
    patch = None
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1545
    args = list(args)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1546
    if opts['list']:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1547
        if args or opts['none']:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1548
            raise util.Abort(_('cannot mix -l/--list with options or arguments'))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1549
        for i in xrange(len(q.series)):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1550
            status(i)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1551
        return
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1552
    if not args or args[0][0:1] in '-+':
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1553
        if not q.applied:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1554
            raise util.Abort(_('no patches applied'))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1555
        patch = q.applied[-1].name
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1556
    if patch is None and args[0][0:1] not in '-+':
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1557
        patch = args.pop(0)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1558
    if patch is None:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1559
        raise util.Abort(_('no patch to work with'))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1560
    if args or opts['none']:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1561
        q.set_guards(q.find_series(patch), args)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1562
        q.save_dirty()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1563
    else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1564
        status(q.series.index(q.lookup(patch)))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1565
2747
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  1566
def header(ui, repo, patch=None):
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  1567
    """Print the header of the topmost or specified patch"""
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  1568
    q = repo.mq
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  1569
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  1570
    if patch:
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  1571
        patch = q.lookup(patch)
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  1572
    else:
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  1573
        if not q.applied:
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  1574
            ui.write('No patches applied\n')
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  1575
            return
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  1576
        patch = q.lookup('qtip')
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  1577
    message = repo.mq.readheaders(patch)[0]
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  1578
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  1579
    ui.write('\n'.join(message) + '\n')
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  1580
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1581
def lastsavename(path):
2794
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
  1582
    (directory, base) = os.path.split(path)
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
  1583
    names = os.listdir(directory)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1584
    namere = re.compile("%s.([0-9]+)" % base)
2794
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
  1585
    maxindex = None
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1586
    maxname = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1587
    for f in names:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1588
        m = namere.match(f)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1589
        if m:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1590
            index = int(m.group(1))
2794
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
  1591
            if maxindex == None or index > maxindex:
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
  1592
                maxindex = index
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1593
                maxname = f
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1594
    if maxname:
2794
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
  1595
        return (os.path.join(directory, maxname), maxindex)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1596
    return (None, None)
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1597
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1598
def savename(path):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1599
    (last, index) = lastsavename(path)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1600
    if last is None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1601
        index = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1602
    newpath = path + ".%d" % (index + 1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1603
    return newpath
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1604
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1605
def push(ui, repo, patch=None, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1606
    """push the next patch onto the stack"""
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  1607
    q = repo.mq
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1608
    mergeq = None
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1609
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1610
    if opts['all']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1611
        patch = q.series[-1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1612
    if opts['merge']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1613
        if opts['name']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1614
            newpath = opts['name']
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1615
        else:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1616
            newpath, i = lastsavename(q.path)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1617
        if not newpath:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1618
            ui.warn("no saved queues found, please use -n\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1619
            return 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1620
        mergeq = queue(ui, repo.join(""), newpath)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1621
        ui.warn("merging with queue at: %s\n" % mergeq.path)
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1622
    ret = q.push(repo, patch, force=opts['force'], list=opts['list'],
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1623
                 mergeq=mergeq)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1624
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1625
    return ret
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1626
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1627
def pop(ui, repo, patch=None, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1628
    """pop the current patch off the stack"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1629
    localupdate = True
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1630
    if opts['name']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1631
        q = queue(ui, repo.join(""), repo.join(opts['name']))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1632
        ui.warn('using patch queue: %s\n' % q.path)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1633
        localupdate = False
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1634
    else:
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  1635
        q = repo.mq
2697
6c540dd14c38 mq: qpop should act like quilt pop
Chris Mason <mason@suse.com>
parents: 2696
diff changeset
  1636
    q.pop(repo, patch, force=opts['force'], update=localupdate, all=opts['all'])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1637
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1638
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1639
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1640
def rename(ui, repo, patch, name=None, **opts):
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1641
    """rename a patch
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1642
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1643
    With one argument, renames the current patch to PATCH1.
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1644
    With two arguments, renames PATCH1 to PATCH2."""
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1645
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1646
    q = repo.mq
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1647
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1648
    if not name:
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1649
        name = patch
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1650
        patch = None
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1651
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1652
    if name in q.series:
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1653
        raise util.Abort(_('A patch named %s already exists in the series file') % name)
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1654
2819
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
  1655
    absdest = q.join(name)
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1656
    if os.path.exists(absdest):
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1657
        raise util.Abort(_('%s already exists') % absdest)
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1658
    
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1659
    if patch:
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1660
        patch = q.lookup(patch)
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1661
    else:
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1662
        if not q.applied:
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1663
            ui.write(_('No patches applied\n'))
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1664
            return
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1665
        patch = q.lookup('qtip')
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1666
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1667
    if ui.verbose:
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1668
        ui.write('Renaming %s to %s\n' % (patch, name))
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1669
    i = q.find_series(patch)
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1670
    q.full_series[i] = name
2767
60683ab1ed33 mq: rename read_series as parse_series, make simpler and faster
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2766
diff changeset
  1671
    q.parse_series()
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1672
    q.series_dirty = 1
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1673
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1674
    info = q.isapplied(patch)
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1675
    if info:
2818
bdc067ff6cf5 Make mq camelcase consistent with the rest of hg.
Brendan Cully <brendan@kublai.com>
parents: 2816
diff changeset
  1676
        q.applied[info[0]] = statusentry(info[1], name)
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1677
    q.applied_dirty = 1
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1678
2819
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
  1679
    util.rename(q.join(patch), absdest)
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1680
    r = q.qrepo()
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1681
    if r:
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1682
        wlock = r.wlock()
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1683
        if r.dirstate.state(name) == 'r':
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1684
            r.undelete([name], wlock)
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1685
        r.copy(patch, name, wlock)
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1686
        r.remove([patch], False, wlock)
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1687
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1688
    q.save_dirty()
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1689
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1690
def restore(ui, repo, rev, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1691
    """restore the queue state saved by a rev"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1692
    rev = repo.lookup(rev)
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  1693
    q = repo.mq
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1694
    q.restore(repo, rev, delete=opts['delete'],
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1695
              qupdate=opts['update'])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1696
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1697
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1698
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1699
def save(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1700
    """save current queue state"""
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  1701
    q = repo.mq
2804
4b20daa25f15 Update mq to use new logmessage arglist from 2794:bd8a9a94139f
Brendan Cully <brendan@kublai.com>
parents: 2803
diff changeset
  1702
    message = commands.logmessage(opts)
2694
0fb28dbf0dc7 MQ: uniformise message and logfile option.
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2682
diff changeset
  1703
    ret = q.save(repo, msg=message)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1704
    if ret:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1705
        return ret
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1706
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1707
    if opts['copy']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1708
        path = q.path
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1709
        if opts['name']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1710
            newpath = os.path.join(q.basepath, opts['name'])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1711
            if os.path.exists(newpath):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1712
                if not os.path.isdir(newpath):
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
  1713
                    raise util.Abort(_('destination %s exists and is not '
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
  1714
                                       'a directory') % newpath)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1715
                if not opts['force']:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
  1716
                    raise util.Abort(_('destination %s exists, '
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
  1717
                                       'use -f to force') % newpath)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1718
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1719
            newpath = savename(path)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1720
        ui.warn("copy %s to %s\n" % (path, newpath))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1721
        util.copyfiles(path, newpath)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1722
    if opts['empty']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1723
        try:
2819
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
  1724
            os.unlink(q.join(q.status_path))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1725
        except:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1726
            pass
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1727
    return 0
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1728
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1729
def strip(ui, repo, rev, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1730
    """strip a revision and all later revs on the same branch"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1731
    rev = repo.lookup(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1732
    backup = 'all'
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1733
    if opts['backup']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1734
        backup = 'strip'
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1735
    elif opts['nobackup']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1736
        backup = 'none'
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  1737
    repo.mq.strip(repo, rev, backup=backup)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1738
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1739
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1740
def select(ui, repo, *args, **opts):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1741
    '''set or print guarded patches to push
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1742
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1743
    use qguard command to set or print guards on patch.  then use
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1744
    qselect to tell mq which guards to use.  example:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1745
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1746
        qguard foo.patch -stable    (nagative guard)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1747
        qguard bar.patch +stable    (posative guard)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1748
        qselect stable
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1749
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1750
    this sets "stable" guard.  mq will skip foo.patch (because it has
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1751
    nagative match) but push bar.patch (because it has posative
2850
851b07ec450c mq: apply patch is any posative guard matches
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2848
diff changeset
  1752
    match).  patch is pushed if any posative guards match and no
2829
05316bb57d01 mq: make guards more strict, add tests
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2828
diff changeset
  1753
    nagative guards match.
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1754
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1755
    with no arguments, default is to print current active guards.
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1756
    with arguments, set active guards as given.
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1757
    
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1758
    use -n/--none to deactivate guards (no other arguments needed).
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1759
    when no guards active, patches with posative guards are skipped,
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1760
    patches with nagative guards are pushed.
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1761
2844
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1762
    qselect can change guards of applied patches. it does not pop
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1763
    guarded patches by default.  use --pop to pop back to last applied
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1764
    patch that is not guarded.  use --reapply (implies --pop) to push
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1765
    back to current patch afterwards, but skip guarded patches.
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1766
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1767
    use -s/--series to print list of all guards in series file (no
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1768
    other arguments needed).  use -v for more information.'''
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1769
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1770
    q = repo.mq
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1771
    guards = q.active()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1772
    if args or opts['none']:
2844
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1773
        old_unapplied = q.unapplied(repo)
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1774
        old_guarded = [i for i in xrange(len(q.applied)) if
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1775
                       not q.pushable(i)[0]]
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1776
        q.set_active(args)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1777
        q.save_dirty()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1778
        if not args:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1779
            ui.status(_('guards deactivated\n'))
2844
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1780
        if not opts['pop'] and not opts['reapply']:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1781
            unapplied = q.unapplied(repo)
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1782
            guarded = [i for i in xrange(len(q.applied))
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1783
                       if not q.pushable(i)[0]]
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1784
            if len(unapplied) != len(old_unapplied):
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1785
                ui.status(_('number of unguarded, unapplied patches has '
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1786
                            'changed from %d to %d\n') %
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1787
                          (len(old_unapplied), len(unapplied)))
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1788
            if len(guarded) != len(old_guarded):
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1789
                ui.status(_('number of guarded, applied patches has changed '
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1790
                            'from %d to %d\n') %
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1791
                          (len(old_guarded), len(guarded)))
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1792
    elif opts['series']:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1793
        guards = {}
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1794
        noguards = 0
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1795
        for gs in q.series_guards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1796
            if not gs:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1797
                noguards += 1
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1798
            for g in gs:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1799
                guards.setdefault(g, 0)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1800
                guards[g] += 1
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1801
        if ui.verbose:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1802
            guards['NONE'] = noguards
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1803
        guards = guards.items()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1804
        guards.sort(lambda a, b: cmp(a[0][1:], b[0][1:]))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1805
        if guards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1806
            ui.note(_('guards in series file:\n'))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1807
            for guard, count in guards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1808
                ui.note('%2d  ' % count)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1809
                ui.write(guard, '\n')
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1810
        else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1811
            ui.note(_('no guards in series file\n'))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1812
    else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1813
        if guards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1814
            ui.note(_('active guards:\n'))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1815
            for g in guards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1816
                ui.write(g, '\n')
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1817
        else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1818
            ui.write(_('no active guards\n'))
2844
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1819
    reapply = opts['reapply'] and q.applied and q.appliedname(-1)
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1820
    popped = False
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1821
    if opts['pop'] or opts['reapply']:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1822
        for i in xrange(len(q.applied)):
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1823
            pushable, reason = q.pushable(i)
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1824
            if not pushable:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1825
                ui.status(_('popping guarded patches\n'))
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1826
                popped = True
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1827
                if i == 0:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1828
                    q.pop(repo, all=True)
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1829
                else:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1830
                    q.pop(repo, i-1)
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1831
                break
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1832
    if popped:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1833
        try:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1834
            if reapply:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1835
                ui.status(_('reapplying unguarded patches\n'))
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1836
                q.push(repo, reapply)
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1837
        finally:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1838
            q.save_dirty()
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1839
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1840
def reposetup(ui, repo):
2818
bdc067ff6cf5 Make mq camelcase consistent with the rest of hg.
Brendan Cully <brendan@kublai.com>
parents: 2816
diff changeset
  1841
    class mqrepo(repo.__class__):
2848
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2845
diff changeset
  1842
        def abort_if_wdir_patched(self, errmsg, force=False):
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2845
diff changeset
  1843
            if self.mq.applied and not force:
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2845
diff changeset
  1844
                parent = revlog.hex(self.dirstate.parents()[0])
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2845
diff changeset
  1845
                if parent in [s.rev for s in self.mq.applied]:
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2845
diff changeset
  1846
                    raise util.Abort(errmsg)
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2845
diff changeset
  1847
            
2845
addd03c7fbfa Disallow commit over an applied mq patch.
Brendan Cully <brendan@kublai.com>
parents: 2844
diff changeset
  1848
        def commit(self, *args, **opts):
addd03c7fbfa Disallow commit over an applied mq patch.
Brendan Cully <brendan@kublai.com>
parents: 2844
diff changeset
  1849
            if len(args) >= 6:
addd03c7fbfa Disallow commit over an applied mq patch.
Brendan Cully <brendan@kublai.com>
parents: 2844
diff changeset
  1850
                force = args[5]
addd03c7fbfa Disallow commit over an applied mq patch.
Brendan Cully <brendan@kublai.com>
parents: 2844
diff changeset
  1851
            else:
addd03c7fbfa Disallow commit over an applied mq patch.
Brendan Cully <brendan@kublai.com>
parents: 2844
diff changeset
  1852
                force = opts.get('force')
2848
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2845
diff changeset
  1853
            self.abort_if_wdir_patched(
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2845
diff changeset
  1854
                _('cannot commit over an applied mq patch'),
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2845
diff changeset
  1855
                force)
2845
addd03c7fbfa Disallow commit over an applied mq patch.
Brendan Cully <brendan@kublai.com>
parents: 2844
diff changeset
  1856
addd03c7fbfa Disallow commit over an applied mq patch.
Brendan Cully <brendan@kublai.com>
parents: 2844
diff changeset
  1857
            return super(mqrepo, self).commit(*args, **opts)
addd03c7fbfa Disallow commit over an applied mq patch.
Brendan Cully <brendan@kublai.com>
parents: 2844
diff changeset
  1858
2848
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2845
diff changeset
  1859
        def push(self, remote, force=False, revs=None):
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2845
diff changeset
  1860
            if self.mq.applied and not force:
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2845
diff changeset
  1861
                raise util.Abort(_('source has mq patches applied'))
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2845
diff changeset
  1862
            return super(mqrepo, self).push(remote, force, revs)
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2845
diff changeset
  1863
            
2723
04d9b31faeca mq: do not hold a reference to repo in tags override
Brendan Cully <brendan@kublai.com>
parents: 2720
diff changeset
  1864
        def tags(self):
04d9b31faeca mq: do not hold a reference to repo in tags override
Brendan Cully <brendan@kublai.com>
parents: 2720
diff changeset
  1865
            if self.tagscache:
04d9b31faeca mq: do not hold a reference to repo in tags override
Brendan Cully <brendan@kublai.com>
parents: 2720
diff changeset
  1866
                return self.tagscache
04d9b31faeca mq: do not hold a reference to repo in tags override
Brendan Cully <brendan@kublai.com>
parents: 2720
diff changeset
  1867
2818
bdc067ff6cf5 Make mq camelcase consistent with the rest of hg.
Brendan Cully <brendan@kublai.com>
parents: 2816
diff changeset
  1868
            tagscache = super(mqrepo, self).tags()
2682
4e2dc5c16e61 Add mq patch names to tagscache instead of overriding lookup.
Brendan Cully <brendan@kublai.com>
parents: 2677
diff changeset
  1869
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  1870
            q = self.mq
2723
04d9b31faeca mq: do not hold a reference to repo in tags override
Brendan Cully <brendan@kublai.com>
parents: 2720
diff changeset
  1871
            if not q.applied:
04d9b31faeca mq: do not hold a reference to repo in tags override
Brendan Cully <brendan@kublai.com>
parents: 2720
diff changeset
  1872
                return tagscache
2663
96950d39171d Mq: modify repo.lookup to resolve applied patches too.
Brendan Cully <brendan@kublai.com>
parents: 2554
diff changeset
  1873
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
  1874
            mqtags = [(patch.rev, patch.name) for patch in q.applied]
2723
04d9b31faeca mq: do not hold a reference to repo in tags override
Brendan Cully <brendan@kublai.com>
parents: 2720
diff changeset
  1875
            mqtags.append((mqtags[-1][0], 'qtip'))
04d9b31faeca mq: do not hold a reference to repo in tags override
Brendan Cully <brendan@kublai.com>
parents: 2720
diff changeset
  1876
            mqtags.append((mqtags[0][0], 'qbase'))
04d9b31faeca mq: do not hold a reference to repo in tags override
Brendan Cully <brendan@kublai.com>
parents: 2720
diff changeset
  1877
            for patch in mqtags:
04d9b31faeca mq: do not hold a reference to repo in tags override
Brendan Cully <brendan@kublai.com>
parents: 2720
diff changeset
  1878
                if patch[1] in tagscache:
04d9b31faeca mq: do not hold a reference to repo in tags override
Brendan Cully <brendan@kublai.com>
parents: 2720
diff changeset
  1879
                    self.ui.warn('Tag %s overrides mq patch of the same name\n' % patch[1])
04d9b31faeca mq: do not hold a reference to repo in tags override
Brendan Cully <brendan@kublai.com>
parents: 2720
diff changeset
  1880
                else:
04d9b31faeca mq: do not hold a reference to repo in tags override
Brendan Cully <brendan@kublai.com>
parents: 2720
diff changeset
  1881
                    tagscache[patch[1]] = revlog.bin(patch[0])
2682
4e2dc5c16e61 Add mq patch names to tagscache instead of overriding lookup.
Brendan Cully <brendan@kublai.com>
parents: 2677
diff changeset
  1882
4e2dc5c16e61 Add mq patch names to tagscache instead of overriding lookup.
Brendan Cully <brendan@kublai.com>
parents: 2677
diff changeset
  1883
            return tagscache
2664
9b8df8dceeed Add qtip and qbase to mq qlookup.
Brendan Cully <brendan@kublai.com>
parents: 2663
diff changeset
  1884
2851
82f50658c72b mq: only add mq attribute to local repo
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2850
diff changeset
  1885
    if repo.local():
82f50658c72b mq: only add mq attribute to local repo
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2850
diff changeset
  1886
        repo.__class__ = mqrepo
82f50658c72b mq: only add mq attribute to local repo
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2850
diff changeset
  1887
        repo.mq = queue(ui, repo.join(""))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1888
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1889
cmdtable = {
2185
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
  1890
    "qapplied": (applied, [], 'hg qapplied [PATCH]'),
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1891
    "qclone": (clone,
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1892
               [('', 'pull', None, _('use pull protocol to copy metadata')),
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1893
                ('U', 'noupdate', None, _('do not update the new working directories')),
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1894
                ('', 'uncompressed', None,
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1895
                 _('use uncompressed transfer (fast over LAN)')),
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1896
                ('e', 'ssh', '', _('specify ssh command to use')),
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1897
                ('p', 'patches', '', _('location of source patch repo')),
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1898
                ('', 'remotecmd', '',
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1899
                 _('specify hg command to run on the remote side'))],
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1900
               'hg qclone [OPTION]... SOURCE [DEST]'),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1901
    "qcommit|qci":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1902
        (commit,
2185
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
  1903
         commands.table["^commit|ci"][1],
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
  1904
         'hg qcommit [OPTION]... [FILE]...'),
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
  1905
    "^qdiff": (diff, [], 'hg qdiff [FILE]...'),
2904
57b88b86a845 Replace qdel/qfold -f option with -k/--keep.
Brendan Cully <brendan@kublai.com>
parents: 2883
diff changeset
  1906
    "qdelete|qremove|qrm":
2752
5dfeda163bb7 Add -f option to qdelete, to remove patch file.
Brendan Cully <brendan@kublai.com>
parents: 2751
diff changeset
  1907
        (delete,
2904
57b88b86a845 Replace qdel/qfold -f option with -k/--keep.
Brendan Cully <brendan@kublai.com>
parents: 2883
diff changeset
  1908
         [('k', 'keep', None, _('keep patch file'))],
57b88b86a845 Replace qdel/qfold -f option with -k/--keep.
Brendan Cully <brendan@kublai.com>
parents: 2883
diff changeset
  1909
          'hg qdelete [-k] PATCH'),
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1910
    'qfold':
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1911
        (fold,
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1912
         [('e', 'edit', None, _('edit patch header')),
2904
57b88b86a845 Replace qdel/qfold -f option with -k/--keep.
Brendan Cully <brendan@kublai.com>
parents: 2883
diff changeset
  1913
          ('k', 'keep', None, _('keep folded patch files')),
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1914
          ('m', 'message', '', _('set patch header to <text>')),
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1915
          ('l', 'logfile', '', _('set patch header to contents of <file>'))],
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1916
         'hg qfold [-e] [-m <text>] [-l <file] PATCH...'),
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1917
    'qguard': (guard, [('l', 'list', None, _('list all patches and guards')),
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1918
                       ('n', 'none', None, _('drop all guards'))],
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1919
               'hg qguard [PATCH] [+GUARD...] [-GUARD...]'),
2747
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  1920
    'qheader': (header, [],
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  1921
                _('hg qheader [PATCH]')),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1922
    "^qimport":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1923
        (qimport,
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1924
         [('e', 'existing', None, 'import file in patch dir'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1925
          ('n', 'name', '', 'patch file name'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1926
          ('f', 'force', None, 'overwrite existing files')],
2185
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
  1927
         'hg qimport [-e] [-n NAME] [-f] FILE...'),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1928
    "^qinit":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1929
        (init,
2526
37785f986260 mq: Added help for qcommit, consistently talk about queue repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2488
diff changeset
  1930
         [('c', 'create-repo', None, 'create queue repository')],
2185
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
  1931
         'hg qinit [-c]'),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1932
    "qnew":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1933
        (new,
2694
0fb28dbf0dc7 MQ: uniformise message and logfile option.
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2682
diff changeset
  1934
         [('m', 'message', '', _('use <text> as commit message')),
0fb28dbf0dc7 MQ: uniformise message and logfile option.
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2682
diff changeset
  1935
          ('l', 'logfile', '', _('read the commit message from <file>')),
2754
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  1936
          ('f', 'force', None, _('import uncommitted changes into patch'))],
2694
0fb28dbf0dc7 MQ: uniformise message and logfile option.
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2682
diff changeset
  1937
         'hg qnew [-m TEXT] [-l FILE] [-f] PATCH'),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1938
    "qnext": (next, [], 'hg qnext'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1939
    "qprev": (prev, [], 'hg qprev'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1940
    "^qpop":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1941
        (pop,
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1942
         [('a', 'all', None, 'pop all patches'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1943
          ('n', 'name', '', 'queue name to pop'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1944
          ('f', 'force', None, 'forget any local changes')],
2185
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
  1945
         'hg qpop [-a] [-n NAME] [-f] [PATCH | INDEX]'),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1946
    "^qpush":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1947
        (push,
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1948
         [('f', 'force', None, 'apply if the patch has rejects'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1949
          ('l', 'list', None, 'list patch name in commit text'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1950
          ('a', 'all', None, 'apply all patches'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1951
          ('m', 'merge', None, 'merge from another queue'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1952
          ('n', 'name', '', 'merge queue name')],
2185
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
  1953
         'hg qpush [-f] [-l] [-a] [-m] [-n NAME] [PATCH | INDEX]'),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1954
    "^qrefresh":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1955
        (refresh,
2746
0503eb5c0a33 Add option -e/--edit to qrefresh, to edit the existing header.
Brendan Cully <brendan@kublai.com>
parents: 2745
diff changeset
  1956
         [('e', 'edit', None, _('edit commit message')),
0503eb5c0a33 Add option -e/--edit to qrefresh, to edit the existing header.
Brendan Cully <brendan@kublai.com>
parents: 2745
diff changeset
  1957
          ('m', 'message', '', _('change commit message with <text>')),
2694
0fb28dbf0dc7 MQ: uniformise message and logfile option.
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2682
diff changeset
  1958
          ('l', 'logfile', '', _('change commit message with <file> content')),
0fb28dbf0dc7 MQ: uniformise message and logfile option.
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2682
diff changeset
  1959
          ('s', 'short', None, 'short refresh')],
2746
0503eb5c0a33 Add option -e/--edit to qrefresh, to edit the existing header.
Brendan Cully <brendan@kublai.com>
parents: 2745
diff changeset
  1960
         'hg qrefresh [-e] [-m TEXT] [-l FILE] [-s]'),
2751
7d1de4545728 mq: add qmv as alias for qrename
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2750
diff changeset
  1961
    'qrename|qmv':
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1962
        (rename, [], 'hg qrename PATCH1 [PATCH2]'),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1963
    "qrestore":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1964
        (restore,
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1965
         [('d', 'delete', None, 'delete save entry'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1966
          ('u', 'update', None, 'update queue working dir')],
2185
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
  1967
         'hg qrestore [-d] [-u] REV'),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1968
    "qsave":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1969
        (save,
2694
0fb28dbf0dc7 MQ: uniformise message and logfile option.
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2682
diff changeset
  1970
         [('m', 'message', '', _('use <text> as commit message')),
0fb28dbf0dc7 MQ: uniformise message and logfile option.
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2682
diff changeset
  1971
          ('l', 'logfile', '', _('read the commit message from <file>')),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1972
          ('c', 'copy', None, 'copy patch directory'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1973
          ('n', 'name', '', 'copy directory name'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1974
          ('e', 'empty', None, 'clear queue status file'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1975
          ('f', 'force', None, 'force copy')],
2694
0fb28dbf0dc7 MQ: uniformise message and logfile option.
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2682
diff changeset
  1976
         'hg qsave [-m TEXT] [-l FILE] [-c] [-n NAME] [-e] [-f]'),
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1977
    "qselect": (select,
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1978
                [('n', 'none', None, _('disable all guards')),
2844
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1979
                 ('s', 'series', None, _('list all guards in series file')),
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1980
                 ('', 'pop', None,
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1981
                  _('pop to before first guarded applied patch')),
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1982
                 ('', 'reapply', None, _('pop, then reapply patches'))],
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1983
                'hg qselect [OPTION...] [GUARD...]'),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1984
    "qseries":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1985
        (series,
2756
caa6d992608b Add -s option to qseries: display first line of patch header.
Brendan Cully <brendan@kublai.com>
parents: 2754
diff changeset
  1986
         [('m', 'missing', None, 'print patches not in series'),
caa6d992608b Add -s option to qseries: display first line of patch header.
Brendan Cully <brendan@kublai.com>
parents: 2754
diff changeset
  1987
          ('s', 'summary', None, _('print first line of patch header'))],
2185
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
  1988
         'hg qseries [-m]'),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1989
    "^strip":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1990
        (strip,
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1991
         [('f', 'force', None, 'force multi-head removal'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1992
          ('b', 'backup', None, 'bundle unrelated changesets'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1993
          ('n', 'nobackup', None, 'no backups')],
2185
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
  1994
         'hg strip [-f] [-b] [-n] REV'),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1995
    "qtop": (top, [], 'hg qtop'),
2185
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
  1996
    "qunapplied": (unapplied, [], 'hg qunapplied [PATCH]'),
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1997
}