hgext/mq.py
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
Thu, 23 Aug 2007 01:48:29 -0300
changeset 5210 90d9ec0dc69d
parent 5175 f8aa16533ddf
child 5213 988ed47d9d65
permissions -rw-r--r--
merge: forcefully mark files that we get from the second parent as dirty After a hg merge, we want to include in the commit all the files that we got from the second parent, so that we have the correct file-level history. To make them visible to hg commit, we try to mark them as dirty. Unfortunately, right now we can't really mark them as dirty[1] - the best we can do is to mark them as needing a full comparison of their contents, but they will still be considered clean if they happen to be identical to the version in the first parent. This changeset extends the dirstate format in a compatible way, so that we can mark a file as dirty: Right now we use a negative file size to indicate we don't have valid stat data for this entry. In practice, this size is always -1. This patch uses -2 to indicate that the entry is dirty. Older versions of hg won't choke on this dirstate, but they may happily mark the file as clean after a full comparison, destroying all of our hard work. The patch adds a dirstate.normallookup method with the semantics of the current normaldirty, and changes normaldirty to forcefully mark the entry as dirty. This should fix issue522. [1] - well, we could put them in state 'm', but that state has a different meaning.
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
#
2858
345bac2bc4ec update copyrights.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2855
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
3893
6b4127c7d52a Simplify i18n imports
Matt Mackall <mpm@selenic.com>
parents: 3886
diff changeset
    32
from mercurial.i18n import _
4702
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents: 4701
diff changeset
    33
from mercurial import commands, cmdutil, hg, patch, revlog, util
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents: 4701
diff changeset
    34
from mercurial import repair
3963
ba45041827a2 remove various unused import
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3902
diff changeset
    35
import os, sys, re, errno
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: 2712
diff changeset
    37
commands.norepo += " qclone qversion"
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
    38
4037
bbdba01cce28 Enforce unixish style for all generated patch names.
Patrick Mezard <pmezard@gmail.com>
parents: 4016
diff changeset
    39
# Patch names looks like unix-file names.
bbdba01cce28 Enforce unixish style for all generated patch names.
Patrick Mezard <pmezard@gmail.com>
parents: 4016
diff changeset
    40
# They must be joinable with queue directory and result in the patch path.
bbdba01cce28 Enforce unixish style for all generated patch names.
Patrick Mezard <pmezard@gmail.com>
parents: 4016
diff changeset
    41
normname = util.normpath
bbdba01cce28 Enforce unixish style for all generated patch names.
Patrick Mezard <pmezard@gmail.com>
parents: 4016
diff changeset
    42
2807
bdc067ff6cf5 Make mq camelcase consistent with the rest of hg.
Brendan Cully <brendan@kublai.com>
parents: 2805
diff changeset
    43
class statusentry:
2775
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
    44
    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
    45
        if not name:
3088
7fa3d38a99b6 mq: handle patch names containing ":"
Brendan Cully <brendan@kublai.com>
parents: 3085
diff changeset
    46
            fields = rev.split(':', 1)
2805
52516e48e3f3 Update qsave to use StatusEntry; don't throw exception on bad status lines.
Brendan Cully <brendan@kublai.com>
parents: 2804
diff changeset
    47
            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
    48
                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
    49
            else:
52516e48e3f3 Update qsave to use StatusEntry; don't throw exception on bad status lines.
Brendan Cully <brendan@kublai.com>
parents: 2804
diff changeset
    50
                self.rev, self.name = None, None
2775
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
    51
        else:
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
    52
            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
    53
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
    54
    def __str__(self):
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
    55
        return self.rev + ':' + self.name
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
    56
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    57
class queue:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    58
    def __init__(self, ui, path, patchdir=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    59
        self.basepath = path
2808
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2807
diff changeset
    60
        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
    61
        self.opener = util.opener(self.path)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    62
        self.ui = ui
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    63
        self.applied = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    64
        self.full_series = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    65
        self.applied_dirty = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    66
        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
    67
        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
    68
        self.status_path = "status"
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
    69
        self.guards_path = "guards"
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
    70
        self.active_guards = None
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
    71
        self.guards_dirty = False
2873
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2872
diff changeset
    72
        self._diffopts = None
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
    73
2808
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2807
diff changeset
    74
        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
    75
            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
    76
        self.parse_series()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    77
2808
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2807
diff changeset
    78
        if os.path.exists(self.join(self.status_path)):
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
    79
            lines = self.opener(self.status_path).read().splitlines()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
    80
            self.applied = [statusentry(l) for l in lines]
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    81
2873
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2872
diff changeset
    82
    def diffopts(self):
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2872
diff changeset
    83
        if self._diffopts is None:
2908
3848488244fc Move ui.diffopts to patch.diffopts where it belongs
Matt Mackall <mpm@selenic.com>
parents: 2882
diff changeset
    84
            self._diffopts = patch.diffopts(self.ui)
2873
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2872
diff changeset
    85
        return self._diffopts
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2872
diff changeset
    86
2808
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2807
diff changeset
    87
    def join(self, *p):
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2807
diff changeset
    88
        return os.path.join(self.path, *p)
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2807
diff changeset
    89
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    90
    def find_series(self, patch):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    91
        pre = re.compile("(\s*)([^#]+)")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    92
        index = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    93
        for l in self.full_series:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    94
            m = pre.match(l)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    95
            if m:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    96
                s = m.group(2)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    97
                s = s.rstrip()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    98
                if s == patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    99
                    return index
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   100
            index += 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   101
        return None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   102
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   103
    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: 2808
diff changeset
   104
2767
60683ab1ed33 mq: rename read_series as parse_series, make simpler and faster
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2766
diff changeset
   105
    def parse_series(self):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   106
        self.series = []
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   107
        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
   108
        for l in self.full_series:
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   109
            h = l.find('#')
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   110
            if h == -1:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   111
                patch = l
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   112
                comment = ''
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   113
            elif h == 0:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   114
                continue
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   115
            else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   116
                patch = l[:h]
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   117
                comment = l[h:]
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   118
            patch = patch.strip()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   119
            if patch:
3177
87b7ae306d54 mq: bail out if a patch appears more than once in the series file.
Brendan Cully <brendan@kublai.com>
parents: 3176
diff changeset
   120
                if patch in self.series:
87b7ae306d54 mq: bail out if a patch appears more than once in the series file.
Brendan Cully <brendan@kublai.com>
parents: 3176
diff changeset
   121
                    raise util.Abort(_('%s appears more than once in %s') %
87b7ae306d54 mq: bail out if a patch appears more than once in the series file.
Brendan Cully <brendan@kublai.com>
parents: 3176
diff changeset
   122
                                     (patch, self.join(self.series_path)))
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   123
                self.series.append(patch)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   124
                self.series_guards.append(self.guard_re.findall(comment))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   125
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   126
    def check_guard(self, guard):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   127
        bad_chars = '# \t\r\n\f'
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   128
        first = guard[0]
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   129
        for c in '-+':
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   130
            if first == c:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   131
                return (_('guard %r starts with invalid character: %r') %
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   132
                        (guard, c))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   133
        for c in bad_chars:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   134
            if c in guard:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   135
                return _('invalid character in guard %r: %r') % (guard, c)
3215
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3179
diff changeset
   136
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   137
    def set_active(self, guards):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   138
        for guard in guards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   139
            bad = self.check_guard(guard)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   140
            if bad:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   141
                raise util.Abort(bad)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   142
        guards = dict.fromkeys(guards).keys()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   143
        guards.sort()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   144
        self.ui.debug('active guards: %s\n' % ' '.join(guards))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   145
        self.active_guards = guards
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   146
        self.guards_dirty = True
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   147
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   148
    def active(self):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   149
        if self.active_guards is None:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   150
            self.active_guards = []
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   151
            try:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   152
                guards = self.opener(self.guards_path).read().split()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   153
            except IOError, err:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   154
                if err.errno != errno.ENOENT: raise
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   155
                guards = []
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   156
            for i, guard in enumerate(guards):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   157
                bad = self.check_guard(guard)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   158
                if bad:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   159
                    self.ui.warn('%s:%d: %s\n' %
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   160
                                 (self.join(self.guards_path), i + 1, bad))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   161
                else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   162
                    self.active_guards.append(guard)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   163
        return self.active_guards
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   164
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   165
    def set_guards(self, idx, guards):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   166
        for g in guards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   167
            if len(g) < 2:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   168
                raise util.Abort(_('guard %r too short') % g)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   169
            if g[0] not in '-+':
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   170
                raise util.Abort(_('guard %r starts with invalid char') % g)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   171
            bad = self.check_guard(g[1:])
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   172
            if bad:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   173
                raise util.Abort(bad)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   174
        drop = self.guard_re.sub('', self.full_series[idx])
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   175
        self.full_series[idx] = drop + ''.join([' #' + g for g in guards])
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   176
        self.parse_series()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   177
        self.series_dirty = True
3215
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3179
diff changeset
   178
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   179
    def pushable(self, idx):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   180
        if isinstance(idx, str):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   181
            idx = self.series.index(idx)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   182
        patchguards = self.series_guards[idx]
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   183
        if not patchguards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   184
            return True, None
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   185
        default = False
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   186
        guards = self.active()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   187
        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: 2808
diff changeset
   188
        if exactneg:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   189
            return False, exactneg[0]
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   190
        pos = [g for g in patchguards if g[0] == '+']
2838
851b07ec450c mq: apply patch is any posative guard matches
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2836
diff changeset
   191
        exactpos = [g for g in pos if g[1:] in guards]
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   192
        if pos:
2838
851b07ec450c mq: apply patch is any posative guard matches
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2836
diff changeset
   193
            if exactpos:
851b07ec450c mq: apply patch is any posative guard matches
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2836
diff changeset
   194
                return True, exactpos[0]
851b07ec450c mq: apply patch is any posative guard matches
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2836
diff changeset
   195
            return False, pos
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   196
        return True, ''
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   197
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   198
    def explain_pushable(self, idx, all_patches=False):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   199
        write = all_patches and self.ui.write or self.ui.warn
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   200
        if all_patches or self.ui.verbose:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   201
            if isinstance(idx, str):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   202
                idx = self.series.index(idx)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   203
            pushable, why = self.pushable(idx)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   204
            if all_patches and pushable:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   205
                if why is None:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   206
                    write(_('allowing %s - no guards in effect\n') %
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   207
                          self.series[idx])
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   208
                else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   209
                    if not why:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   210
                        write(_('allowing %s - no matching negative guards\n') %
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   211
                              self.series[idx])
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   212
                    else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   213
                        write(_('allowing %s - guarded by %r\n') %
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   214
                              (self.series[idx], why))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   215
            if not pushable:
2818
05316bb57d01 mq: make guards more strict, add tests
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2817
diff changeset
   216
                if why:
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   217
                    write(_('skipping %s - guarded by %r\n') %
3870
22d18051f9e5 mq: fix explain_pushable for negative guards
Brendan Cully <brendan@kublai.com>
parents: 3857
diff changeset
   218
                          (self.series[idx], why))
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   219
                else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   220
                    write(_('skipping %s - no matching guards\n') %
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   221
                          self.series[idx])
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   222
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   223
    def save_dirty(self):
2772
4720e79486d3 mq: simplify save_dirty
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2771
diff changeset
   224
        def write_list(items, path):
4720e79486d3 mq: simplify save_dirty
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2771
diff changeset
   225
            fp = self.opener(path, 'w')
4720e79486d3 mq: simplify save_dirty
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2771
diff changeset
   226
            for i in items:
4720e79486d3 mq: simplify save_dirty
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2771
diff changeset
   227
                print >> fp, i
4720e79486d3 mq: simplify save_dirty
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2771
diff changeset
   228
            fp.close()
2776
ae726521717c merge with brendan.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2775 2774
diff changeset
   229
        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
   230
        if self.series_dirty: write_list(self.full_series, self.series_path)
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   231
        if self.guards_dirty: write_list(self.active_guards, self.guards_path)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   232
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   233
    def readheaders(self, patch):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   234
        def eatdiff(lines):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   235
            while lines:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   236
                l = lines[-1]
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   237
                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
   238
                    l.startswith("Index:") or
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   239
                    l.startswith("===========")):
1808
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
        def eatempty(lines):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   244
            while lines:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   245
                l = lines[-1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   246
                if re.match('\s*$', l):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   247
                    del lines[-1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   248
                else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   249
                    break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   250
2808
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2807
diff changeset
   251
        pf = self.join(patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   252
        message = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   253
        comments = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   254
        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
   255
        date = None
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   256
        format = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   257
        subject = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   258
        diffstart = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   259
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   260
        for line in file(pf):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   261
            line = line.rstrip()
2934
2f190e998eb3 Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents: 2922
diff changeset
   262
            if line.startswith('diff --git'):
2f190e998eb3 Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents: 2922
diff changeset
   263
                diffstart = 2
2f190e998eb3 Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents: 2922
diff changeset
   264
                break
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   265
            if diffstart:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   266
                if line.startswith('+++ '):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   267
                    diffstart = 2
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   268
                break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   269
            if line.startswith("--- "):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   270
                diffstart = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   271
                continue
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   272
            elif format == "hgpatch":
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   273
                # parse values when importing the result of an hg export
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   274
                if line.startswith("# User "):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   275
                    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
   276
                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
   277
                    date = line[7:]
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   278
                elif not line.startswith("# ") and line:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   279
                    message.append(line)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   280
                    format = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   281
            elif line == '# HG changeset patch':
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   282
                format = "hgpatch"
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   283
            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
   284
                                           line.startswith("subject: "))):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   285
                subject = line[9:]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   286
                format = "tag"
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   287
            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
   288
                                           line.startswith("from: "))):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   289
                user = line[6:]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   290
                format = "tag"
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   291
            elif format == "tag" and line == "":
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   292
                # when looking for tags (subject: from: etc) they
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   293
                # end once you find a blank line in the source
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   294
                format = "tagdone"
2301
7c2623aedeb4 Strip empty lines and trailing spaces around commit messages.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2300
diff changeset
   295
            elif message or line:
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   296
                message.append(line)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   297
            comments.append(line)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   298
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   299
        eatdiff(message)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   300
        eatdiff(comments)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   301
        eatempty(message)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   302
        eatempty(comments)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   303
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   304
        # make sure message isn't empty
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   305
        if format and format.startswith("tag") and subject:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   306
            message.insert(0, "")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   307
            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
   308
        return (message, comments, user, date, diffstart > 1)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   309
4202
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4201
diff changeset
   310
    def removeundo(self, repo):
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4201
diff changeset
   311
        undo = repo.sjoin('undo')
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4201
diff changeset
   312
        if not os.path.exists(undo):
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4201
diff changeset
   313
            return
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4201
diff changeset
   314
        try:
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4201
diff changeset
   315
            os.unlink(undo)
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4201
diff changeset
   316
        except OSError, inst:
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4201
diff changeset
   317
            self.ui.warn('error removing undo: %s\n' % str(inst))
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4201
diff changeset
   318
2873
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2872
diff changeset
   319
    def printdiff(self, repo, node1, node2=None, files=None,
2937
9dc568f5e03d Fix test-mq-qdiff; add -I and -X options to qdiff
Brendan Cully <brendan@kublai.com>
parents: 2936
diff changeset
   320
                  fp=None, changes=None, opts={}):
9dc568f5e03d Fix test-mq-qdiff; add -I and -X options to qdiff
Brendan Cully <brendan@kublai.com>
parents: 2936
diff changeset
   321
        fns, matchfn, anypats = cmdutil.matchpats(repo, files, opts)
9dc568f5e03d Fix test-mq-qdiff; add -I and -X options to qdiff
Brendan Cully <brendan@kublai.com>
parents: 2936
diff changeset
   322
9dc568f5e03d Fix test-mq-qdiff; add -I and -X options to qdiff
Brendan Cully <brendan@kublai.com>
parents: 2936
diff changeset
   323
        patch.diff(repo, node1, node2, fns, match=matchfn,
2873
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2872
diff changeset
   324
                   fp=fp, changes=changes, opts=self.diffopts())
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2872
diff changeset
   325
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   326
    def mergeone(self, repo, mergeq, head, patch, rev):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   327
        # 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
   328
        (err, n) = self.apply(repo, [ patch ], update_status=False,
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   329
                              strict=True, merge=rev)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   330
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   331
        if err == 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   332
            return (err, n)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   333
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   334
        if n is None:
2711
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2710
diff changeset
   335
            raise util.Abort(_("apply failed for patch %s") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   336
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   337
        self.ui.warn("patch didn't work out, merging %s\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   338
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   339
        # apply failed, strip away that rev and merge.
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   340
        hg.clean(repo, head)
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   341
        self.strip(repo, n, update=False, backup='strip')
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   342
3980
e9460fe2f548 mq: use contexts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3963
diff changeset
   343
        ctx = repo.changectx(rev)
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   344
        ret = hg.merge(repo, rev)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   345
        if ret:
2711
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2710
diff changeset
   346
            raise util.Abort(_("update returned %d") % ret)
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   347
        n = repo.commit(None, ctx.description(), ctx.user(), force=1)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   348
        if n == None:
2711
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2710
diff changeset
   349
            raise util.Abort(_("repo commit failed"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   350
        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
   351
            message, comments, user, date, patchfound = mergeq.readheaders(patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   352
        except:
2711
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2710
diff changeset
   353
            raise util.Abort(_("unable to read %s") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   354
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
   355
        patchf = self.opener(patch, "w")
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   356
        if comments:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   357
            comments = "\n".join(comments) + '\n\n'
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   358
            patchf.write(comments)
2873
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2872
diff changeset
   359
        self.printdiff(repo, head, n, fp=patchf)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   360
        patchf.close()
4202
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4201
diff changeset
   361
        self.removeundo(repo)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   362
        return (0, n)
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   363
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   364
    def qparents(self, repo, rev=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   365
        if rev is None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   366
            (p1, p2) = repo.dirstate.parents()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   367
            if p2 == revlog.nullid:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   368
                return p1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   369
            if len(self.applied) == 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   370
                return None
2775
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
   371
            return revlog.bin(self.applied[-1].rev)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   372
        pp = repo.changelog.parents(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   373
        if pp[1] != revlog.nullid:
2775
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
   374
            arevs = [ x.rev for x in self.applied ]
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   375
            p0 = revlog.hex(pp[0])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   376
            p1 = revlog.hex(pp[1])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   377
            if p0 in arevs:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   378
                return pp[0]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   379
            if p1 in arevs:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   380
                return pp[1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   381
        return pp[0]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   382
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   383
    def mergepatch(self, repo, mergeq, series):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   384
        if len(self.applied) == 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   385
            # each of the patches merged in will have two parents.  This
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   386
            # can confuse the qrefresh, qdiff, and strip code because it
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   387
            # needs to know which parent is actually in the patch queue.
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   388
            # so, we insert a merge marker with only one parent.  This way
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   389
            # the first patch in the queue is never a merge patch
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   390
            #
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   391
            pname = ".hg.patches.merge.marker"
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   392
            n = repo.commit(None, '[mq]: merge marker', user=None, force=1)
4202
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4201
diff changeset
   393
            self.removeundo(repo)
2807
bdc067ff6cf5 Make mq camelcase consistent with the rest of hg.
Brendan Cully <brendan@kublai.com>
parents: 2805
diff changeset
   394
            self.applied.append(statusentry(revlog.hex(n), pname))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   395
            self.applied_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   396
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   397
        head = self.qparents(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   398
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   399
        for patch in series:
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   400
            patch = mergeq.lookup(patch, strict=True)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   401
            if not patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   402
                self.ui.warn("patch %s does not exist\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   403
                return (1, None)
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   404
            pushable, reason = self.pushable(patch)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   405
            if not pushable:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   406
                self.explain_pushable(patch, all_patches=True)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   407
                continue
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   408
            info = mergeq.isapplied(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   409
            if not info:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   410
                self.ui.warn("patch %s is not applied\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   411
                return (1, None)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   412
            rev = revlog.bin(info[1])
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   413
            (err, head) = self.mergeone(repo, mergeq, head, patch, rev)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   414
            if head:
2807
bdc067ff6cf5 Make mq camelcase consistent with the rest of hg.
Brendan Cully <brendan@kublai.com>
parents: 2805
diff changeset
   415
                self.applied.append(statusentry(revlog.hex(head), patch))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   416
                self.applied_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   417
            if err:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   418
                return (err, head)
4437
a210b40d0860 Make mergepatch save queue now that qpush isn't.
Brendan Cully <brendan@kublai.com>
parents: 4432
diff changeset
   419
        self.save_dirty()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   420
        return (0, head)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   421
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   422
    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
   423
        '''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
   424
        patchfile: file name of patch'''
3460
2d35a8d2b32d patch: return list of modified files even when an exception is raised
Brendan Cully <brendan@kublai.com>
parents: 3373
diff changeset
   425
        files = {}
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   426
        try:
3460
2d35a8d2b32d patch: return list of modified files even when an exception is raised
Brendan Cully <brendan@kublai.com>
parents: 3373
diff changeset
   427
            fuzz = patch.patch(patchfile, self.ui, strip=1, cwd=repo.root,
2d35a8d2b32d patch: return list of modified files even when an exception is raised
Brendan Cully <brendan@kublai.com>
parents: 3373
diff changeset
   428
                               files=files)
2907
b70740aefa4d Unify mq and hg patch invocation.
Brendan Cully <brendan@kublai.com>
parents: 2890
diff changeset
   429
        except Exception, inst:
b70740aefa4d Unify mq and hg patch invocation.
Brendan Cully <brendan@kublai.com>
parents: 2890
diff changeset
   430
            self.ui.note(str(inst) + '\n')
b70740aefa4d Unify mq and hg patch invocation.
Brendan Cully <brendan@kublai.com>
parents: 2890
diff changeset
   431
            if not self.ui.verbose:
b70740aefa4d Unify mq and hg patch invocation.
Brendan Cully <brendan@kublai.com>
parents: 2890
diff changeset
   432
                self.ui.warn("patch failed, unable to continue (try -v)\n")
3460
2d35a8d2b32d patch: return list of modified files even when an exception is raised
Brendan Cully <brendan@kublai.com>
parents: 3373
diff changeset
   433
            return (False, files, False)
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   434
2934
2f190e998eb3 Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents: 2922
diff changeset
   435
        return (True, files, fuzz)
2791
4c39568007f9 mq: codingstyle
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2790
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,
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   438
              strict=False, patchdir=None, merge=None, all_files={}):
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   439
        wlock = lock = tr = None
4418
0532491f7476 MQ: tidy up if a qpush is interrupted.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4408
diff changeset
   440
        try:
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   441
            wlock = repo.wlock()
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   442
            lock = repo.lock()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   443
            tr = repo.transaction()
4418
0532491f7476 MQ: tidy up if a qpush is interrupted.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4408
diff changeset
   444
            try:
4970
30d4d8985dd8 transactions: avoid late tear-down (issue641)
Matt Mackall <mpm@selenic.com>
parents: 4961
diff changeset
   445
                ret = self._apply(repo, series, list, update_status,
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   446
                                  strict, patchdir, merge, all_files=all_files)
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   447
                tr.close()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   448
                self.save_dirty()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   449
                return ret
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   450
            except:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   451
                try:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   452
                    tr.abort()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   453
                finally:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   454
                    repo.invalidate()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   455
                    repo.dirstate.invalidate()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   456
                raise
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   457
        finally:
5053
47a8ea1eb2c3 del transaction before lock before wlock
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5025
diff changeset
   458
            del tr, lock, wlock
4418
0532491f7476 MQ: tidy up if a qpush is interrupted.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4408
diff changeset
   459
4970
30d4d8985dd8 transactions: avoid late tear-down (issue641)
Matt Mackall <mpm@selenic.com>
parents: 4961
diff changeset
   460
    def _apply(self, repo, series, list=False, update_status=True,
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   461
               strict=False, patchdir=None, merge=None, all_files={}):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   462
        # TODO unify with commands.py
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   463
        if not patchdir:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   464
            patchdir = self.path
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   465
        err = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   466
        n = None
2934
2f190e998eb3 Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents: 2922
diff changeset
   467
        for patchname in series:
2f190e998eb3 Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents: 2922
diff changeset
   468
            pushable, reason = self.pushable(patchname)
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   469
            if not pushable:
2934
2f190e998eb3 Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents: 2922
diff changeset
   470
                self.explain_pushable(patchname, all_patches=True)
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   471
                continue
2934
2f190e998eb3 Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents: 2922
diff changeset
   472
            self.ui.warn("applying %s\n" % patchname)
2f190e998eb3 Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents: 2922
diff changeset
   473
            pf = os.path.join(patchdir, patchname)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   474
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   475
            try:
2934
2f190e998eb3 Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents: 2922
diff changeset
   476
                message, comments, user, date, patchfound = self.readheaders(patchname)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   477
            except:
2934
2f190e998eb3 Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents: 2922
diff changeset
   478
                self.ui.warn("Unable to read %s\n" % patchname)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   479
                err = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   480
                break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   481
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   482
            if not message:
2934
2f190e998eb3 Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents: 2922
diff changeset
   483
                message = "imported patch %s\n" % patchname
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   484
            else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   485
                if list:
2934
2f190e998eb3 Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents: 2922
diff changeset
   486
                    message.append("\nimported patch %s" % patchname)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   487
                message = '\n'.join(message)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   488
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   489
            (patcherr, files, fuzz) = self.patch(repo, pf)
4418
0532491f7476 MQ: tidy up if a qpush is interrupted.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4408
diff changeset
   490
            all_files.update(files)
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   491
            patcherr = not patcherr
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   492
2934
2f190e998eb3 Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents: 2922
diff changeset
   493
            if merge and files:
4332
4e5e1638b165 mq: don't abort when merging a patch that removes files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4242
diff changeset
   494
                # Mark as removed/merged and update dirstate parent info
4e5e1638b165 mq: don't abort when merging a patch that removes files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4242
diff changeset
   495
                removed = []
4e5e1638b165 mq: don't abort when merging a patch that removes files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4242
diff changeset
   496
                merged = []
4e5e1638b165 mq: don't abort when merging a patch that removes files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4242
diff changeset
   497
                for f in files:
4949
fc61495ea9cf dirstate: make wjoin function private
Matt Mackall <mpm@selenic.com>
parents: 4948
diff changeset
   498
                    if os.path.exists(repo.wjoin(f)):
4332
4e5e1638b165 mq: don't abort when merging a patch that removes files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4242
diff changeset
   499
                        merged.append(f)
4e5e1638b165 mq: don't abort when merging a patch that removes files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4242
diff changeset
   500
                    else:
4e5e1638b165 mq: don't abort when merging a patch that removes files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4242
diff changeset
   501
                        removed.append(f)
4948
6fd953d5faea dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents: 4887
diff changeset
   502
                for f in removed:
6fd953d5faea dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents: 4887
diff changeset
   503
                    repo.dirstate.remove(f)
6fd953d5faea dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents: 4887
diff changeset
   504
                for f in merged:
6fd953d5faea dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents: 4887
diff changeset
   505
                    repo.dirstate.merge(f)
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   506
                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
   507
                repo.dirstate.setparents(p1, merge)
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   508
            files = patch.updatedir(self.ui, repo, files)
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   509
            n = repo.commit(files, message, user, date, force=1)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   510
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   511
            if n == None:
2711
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2710
diff changeset
   512
                raise util.Abort(_("repo commit failed"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   513
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   514
            if update_status:
2934
2f190e998eb3 Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents: 2922
diff changeset
   515
                self.applied.append(statusentry(revlog.hex(n), patchname))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   516
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   517
            if patcherr:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   518
                if not patchfound:
2934
2f190e998eb3 Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents: 2922
diff changeset
   519
                    self.ui.warn("patch %s is empty\n" % patchname)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   520
                    err = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   521
                else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   522
                    self.ui.warn("patch failed, rejects left in working dir\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   523
                    err = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   524
                break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   525
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   526
            if fuzz and strict:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   527
                self.ui.warn("fuzz found when applying patch, stopping\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   528
                err = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   529
                break
4202
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4201
diff changeset
   530
        self.removeundo(repo)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   531
        return (err, n)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   532
3085
dc784839516d mq: add qdelete --forget option
Brendan Cully <brendan@kublai.com>
parents: 3084
diff changeset
   533
    def delete(self, repo, patches, opts):
4736
04b2c1e27c26 mq: require patch argument or revision for qdelete
Brendan Cully <brendan@kublai.com>
parents: 4730
diff changeset
   534
        if not patches and not opts.get('rev'):
4737
2ececafa5859 mq: more qdelete help text tweaks
Brendan Cully <brendan@kublai.com>
parents: 4736
diff changeset
   535
            raise util.Abort(_('qdelete requires at least one revision or '
2ececafa5859 mq: more qdelete help text tweaks
Brendan Cully <brendan@kublai.com>
parents: 4736
diff changeset
   536
                               'patch name'))
4736
04b2c1e27c26 mq: require patch argument or revision for qdelete
Brendan Cully <brendan@kublai.com>
parents: 4730
diff changeset
   537
2890
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2889
diff changeset
   538
        realpatches = []
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2889
diff changeset
   539
        for patch in patches:
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2889
diff changeset
   540
            patch = self.lookup(patch, strict=True)
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2889
diff changeset
   541
            info = self.isapplied(patch)
3371
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   542
            if info:
2890
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2889
diff changeset
   543
                raise util.Abort(_("cannot delete applied patch %s") % patch)
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2889
diff changeset
   544
            if patch not in self.series:
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2889
diff changeset
   545
                raise util.Abort(_("patch %s not in series file") % patch)
3371
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   546
            realpatches.append(patch)
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   547
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   548
        appliedbase = 0
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   549
        if opts.get('rev'):
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   550
            if not self.applied:
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   551
                raise util.Abort(_('no patches applied'))
3707
67f44b825784 Removed unused ui parameter from revpair/revrange and fix its users.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3700
diff changeset
   552
            revs = cmdutil.revrange(repo, opts['rev'])
3371
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   553
            if len(revs) > 1 and revs[0] > revs[1]:
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   554
                revs.reverse()
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   555
            for rev in revs:
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   556
                if appliedbase >= len(self.applied):
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   557
                    raise util.Abort(_("revision %d is not managed") % rev)
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   558
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   559
                base = revlog.bin(self.applied[appliedbase].rev)
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   560
                node = repo.changelog.node(rev)
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   561
                if node != base:
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   562
                    raise util.Abort(_("cannot delete revision %d above "
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   563
                                       "applied patches") % rev)
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   564
                realpatches.append(self.applied[appliedbase].name)
3085
dc784839516d mq: add qdelete --forget option
Brendan Cully <brendan@kublai.com>
parents: 3084
diff changeset
   565
                appliedbase += 1
2890
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2889
diff changeset
   566
3085
dc784839516d mq: add qdelete --forget option
Brendan Cully <brendan@kublai.com>
parents: 3084
diff changeset
   567
        if not opts.get('keep'):
2752
5dfeda163bb7 Add -f option to qdelete, to remove patch file.
Brendan Cully <brendan@kublai.com>
parents: 2751
diff changeset
   568
            r = self.qrepo()
5dfeda163bb7 Add -f option to qdelete, to remove patch file.
Brendan Cully <brendan@kublai.com>
parents: 2751
diff changeset
   569
            if r:
2890
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2889
diff changeset
   570
                r.remove(realpatches, True)
2752
5dfeda163bb7 Add -f option to qdelete, to remove patch file.
Brendan Cully <brendan@kublai.com>
parents: 2751
diff changeset
   571
            else:
3373
58202386deb7 mq: make qdelete without -k or a subrepository delete all patches
Brendan Cully <brendan@kublai.com>
parents: 3371
diff changeset
   572
                for p in realpatches:
58202386deb7 mq: make qdelete without -k or a subrepository delete all patches
Brendan Cully <brendan@kublai.com>
parents: 3371
diff changeset
   573
                    os.unlink(self.join(p))
2890
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2889
diff changeset
   574
3371
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   575
        if appliedbase:
3085
dc784839516d mq: add qdelete --forget option
Brendan Cully <brendan@kublai.com>
parents: 3084
diff changeset
   576
            del self.applied[:appliedbase]
dc784839516d mq: add qdelete --forget option
Brendan Cully <brendan@kublai.com>
parents: 3084
diff changeset
   577
            self.applied_dirty = 1
2890
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2889
diff changeset
   578
        indices = [self.find_series(p) for p in realpatches]
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2889
diff changeset
   579
        indices.sort()
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2889
diff changeset
   580
        for i in indices[-1::-1]:
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2889
diff changeset
   581
            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
   582
        self.parse_series()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   583
        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
   584
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   585
    def check_toppatch(self, repo):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   586
        if len(self.applied) > 0:
2775
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
   587
            top = revlog.bin(self.applied[-1].rev)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   588
            pp = repo.dirstate.parents()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   589
            if top not in pp:
2711
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2710
diff changeset
   590
                raise util.Abort(_("queue top not at same revision as working directory"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   591
            return top
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   592
        return None
2874
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
   593
    def check_localchanges(self, repo, force=False, refresh=True):
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
   594
        m, a, r, d = repo.status()[:4]
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
   595
        if m or a or r or d:
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
   596
            if not force:
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
   597
                if refresh:
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
   598
                    raise util.Abort(_("local changes found, refresh first"))
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
   599
                else:
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
   600
                    raise util.Abort(_("local changes found"))
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
   601
        return m, a, r, d
4713
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
   602
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
   603
    def new(self, repo, patch, *pats, **opts):
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
   604
        msg = opts.get('msg')
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
   605
        force = opts.get('force')
2808
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2807
diff changeset
   606
        if os.path.exists(self.join(patch)):
2710
ca97be5babf8 mq: do not allow to qnew a patch twice
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2699
diff changeset
   607
            raise util.Abort(_('patch "%s" already exists') % patch)
4713
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
   608
        if opts.get('include') or opts.get('exclude') or pats:
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
   609
            fns, match, anypats = cmdutil.matchpats(repo, pats, opts)
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
   610
            m, a, r, d = repo.status(files=fns, match=match)[:4]
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
   611
        else:
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
   612
            m, a, r, d = self.check_localchanges(repo, force)
2874
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
   613
        commitfiles = m + a + r
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   614
        self.check_toppatch(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   615
        wlock = repo.wlock()
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   616
        try:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   617
            insert = self.full_series_end()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   618
            if msg:
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   619
                n = repo.commit(commitfiles, msg, force=True)
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   620
            else:
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   621
                n = repo.commit(commitfiles, "[mq]: %s" % patch, force=True)
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   622
            if n == None:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   623
                raise util.Abort(_("repo commit failed"))
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   624
            self.full_series[insert:insert] = [patch]
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   625
            self.applied.append(statusentry(revlog.hex(n), patch))
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   626
            self.parse_series()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   627
            self.series_dirty = 1
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   628
            self.applied_dirty = 1
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   629
            p = self.opener(patch, "w")
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   630
            if msg:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   631
                msg = msg + "\n"
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   632
                p.write(msg)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   633
            p.close()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   634
            wlock = None
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   635
            r = self.qrepo()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   636
            if r: r.add([patch])
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   637
            if commitfiles:
5025
7041869a1bf6 mq: add qnew --git option
Patrick Mezard <pmezard@gmail.com>
parents: 4970
diff changeset
   638
                self.refresh(repo, short=True, git=opts.get('git'))
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   639
            self.removeundo(repo)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   640
        finally:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   641
            del wlock
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   642
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   643
    def strip(self, repo, rev, update=True, backup="all"):
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   644
        wlock = lock = None
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   645
        try:
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   646
            wlock = repo.wlock()
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   647
            lock = repo.lock()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   648
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   649
            if update:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   650
                self.check_localchanges(repo, refresh=False)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   651
                urev = self.qparents(repo, rev)
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   652
                hg.clean(repo, urev)
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   653
                repo.dirstate.write()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   654
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   655
            self.removeundo(repo)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   656
            repair.strip(self.ui, repo, rev, backup)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   657
        finally:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   658
            del lock, wlock
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   659
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   660
    def isapplied(self, patch):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   661
        """returns (index, rev, patch)"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   662
        for i in xrange(len(self.applied)):
2775
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
   663
            a = self.applied[i]
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
   664
            if a.name == patch:
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
   665
                return (i, a.rev, a.name)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   666
        return None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   667
3215
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3179
diff changeset
   668
    # if the exact patch name does not exist, we try a few
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   669
    # variations.  If strict is passed, we try only #1
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   670
    #
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   671
    # 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
   672
    # 2) a unique substring of the patch name was given
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   673
    # 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
   674
    def lookup(self, patch, strict=False):
2832
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
   675
        patch = patch and str(patch)
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
   676
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   677
        def partial_name(s):
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   678
            if s in self.series:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   679
                return s
2765
0327bd1c831c mq: print matches if patch name not unique
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2757
diff changeset
   680
            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
   681
            if len(matches) > 1:
0327bd1c831c mq: print matches if patch name not unique
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2757
diff changeset
   682
                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
   683
                for m in matches:
0327bd1c831c mq: print matches if patch name not unique
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2757
diff changeset
   684
                    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
   685
                return None
0327bd1c831c mq: print matches if patch name not unique
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2757
diff changeset
   686
            if matches:
0327bd1c831c mq: print matches if patch name not unique
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2757
diff changeset
   687
                return matches[0]
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   688
            if len(self.series) > 0 and len(self.applied) > 0:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   689
                if s == 'qtip':
3874
e88d03c2a3d9 mq: fix qheader without args when guards are applied after qtop
Brendan Cully <brendan@kublai.com>
parents: 3871
diff changeset
   690
                    return self.series[self.series_end(True)-1]
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   691
                if s == 'qbase':
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   692
                    return self.series[0]
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   693
            return None
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   694
        if patch == None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   695
            return None
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   697
        # 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
   698
        # 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
   699
        res = partial_name(patch)
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   700
        if res and res == patch:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   701
            return res
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   702
2808
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2807
diff changeset
   703
        if not os.path.isfile(self.join(patch)):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   704
            try:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   705
                sno = int(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   706
            except(ValueError, OverflowError):
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   707
                pass
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   708
            else:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   709
                if sno < len(self.series):
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
   710
                    return self.series[sno]
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   711
            if not strict:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   712
                # return any partial match made above
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   713
                if res:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   714
                    return res
3079
bed7cb835d8d Fixed python2.3 incompatibility (rsplit) in qpush/qpop with index.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3073
diff changeset
   715
                minus = patch.rfind('-')
bed7cb835d8d Fixed python2.3 incompatibility (rsplit) in qpush/qpop with index.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3073
diff changeset
   716
                if minus >= 0:
bed7cb835d8d Fixed python2.3 incompatibility (rsplit) in qpush/qpop with index.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3073
diff changeset
   717
                    res = partial_name(patch[:minus])
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   718
                    if res:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   719
                        i = self.series.index(res)
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   720
                        try:
3079
bed7cb835d8d Fixed python2.3 incompatibility (rsplit) in qpush/qpop with index.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3073
diff changeset
   721
                            off = int(patch[minus+1:] or 1)
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   722
                        except(ValueError, OverflowError):
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   723
                            pass
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   724
                        else:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   725
                            if i - off >= 0:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   726
                                return self.series[i - off]
3079
bed7cb835d8d Fixed python2.3 incompatibility (rsplit) in qpush/qpop with index.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3073
diff changeset
   727
                plus = patch.rfind('+')
bed7cb835d8d Fixed python2.3 incompatibility (rsplit) in qpush/qpop with index.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3073
diff changeset
   728
                if plus >= 0:
bed7cb835d8d Fixed python2.3 incompatibility (rsplit) in qpush/qpop with index.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3073
diff changeset
   729
                    res = partial_name(patch[:plus])
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   730
                    if res:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   731
                        i = self.series.index(res)
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   732
                        try:
3079
bed7cb835d8d Fixed python2.3 incompatibility (rsplit) in qpush/qpop with index.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3073
diff changeset
   733
                            off = int(patch[plus+1:] or 1)
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   734
                        except(ValueError, OverflowError):
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   735
                            pass
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   736
                        else:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   737
                            if i + off < len(self.series):
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   738
                                return self.series[i + off]
2711
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2710
diff changeset
   739
        raise util.Abort(_("patch %s not in series") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   740
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   741
    def push(self, repo, patch=None, force=False, list=False,
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   742
             mergeq=None):
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   743
        wlock = repo.wlock()
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   744
        try:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   745
            patch = self.lookup(patch)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   746
            # Suppose our series file is: A B C and the current 'top'
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   747
            # patch is B. qpush C should be performed (moving forward)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   748
            # qpush B is a NOP (no change) qpush A is an error (can't
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   749
            # go backwards with qpush)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   750
            if patch:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   751
                info = self.isapplied(patch)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   752
                if info:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   753
                    if info[0] < len(self.applied) - 1:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   754
                        raise util.Abort(
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   755
                            _("cannot push to a previous patch: %s") % patch)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   756
                    if info[0] < len(self.series) - 1:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   757
                        self.ui.warn(
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   758
                            _('qpush: %s is already at the top\n') % patch)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   759
                    else:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   760
                        self.ui.warn(_('all patches are currently applied\n'))
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   761
                    return
4100
c30c922f907a Modify qpush/qpop idempotent operations to return success
Ben Thomas <bthomas@virtualiron.com>
parents: 4099
diff changeset
   762
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   763
            # Following the above example, starting at 'top' of B:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   764
            # qpush should be performed (pushes C), but a subsequent
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   765
            # qpush without an argument is an error (nothing to
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   766
            # apply). This allows a loop of "...while hg qpush..." to
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   767
            # work as it detects an error when done
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   768
            if self.series_end() == len(self.series):
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   769
                self.ui.warn(_('patch series already fully applied\n'))
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   770
                return 1
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   771
            if not force:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   772
                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
   773
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   774
            self.applied_dirty = 1;
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   775
            start = self.series_end()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   776
            if start > 0:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   777
                self.check_toppatch(repo)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   778
            if not patch:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   779
                patch = self.series[start]
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   780
                end = start + 1
4418
0532491f7476 MQ: tidy up if a qpush is interrupted.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4408
diff changeset
   781
            else:
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   782
                end = self.series.index(patch, start) + 1
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   783
            s = self.series[start:end]
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   784
            all_files = {}
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   785
            try:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   786
                if mergeq:
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   787
                    ret = self.mergepatch(repo, mergeq, s)
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   788
                else:
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   789
                    ret = self.apply(repo, s, list, all_files=all_files)
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   790
            except:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   791
                self.ui.warn(_('cleaning up working directory...'))
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   792
                node = repo.dirstate.parents()[0]
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   793
                hg.revert(repo, node, None)
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   794
                unknown = repo.status()[4]
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   795
                # only remove unknown files that we know we touched or
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   796
                # created while patching
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   797
                for f in unknown:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   798
                    if f in all_files:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   799
                        util.unlink(repo.wjoin(f))
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   800
                self.ui.warn(_('done\n'))
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   801
                raise
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   802
            top = self.applied[-1].name
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   803
            if ret[0]:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   804
                self.ui.write(
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   805
                    "Errors during apply, please fix and refresh %s\n" % top)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   806
            else:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   807
                self.ui.write("Now at: %s\n" % top)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   808
            return ret[0]
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   809
        finally:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   810
            del wlock
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   811
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   812
    def pop(self, repo, patch=None, force=False, update=True, all=False):
5140
f6c520fd70cf mq: teach qpop about symlinks
Bryan O'Sullivan <bos@serpentine.com>
parents: 5124
diff changeset
   813
        def getfile(f, rev, flags):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   814
            t = repo.file(f).read(rev)
5140
f6c520fd70cf mq: teach qpop about symlinks
Bryan O'Sullivan <bos@serpentine.com>
parents: 5124
diff changeset
   815
            repo.wwrite(f, t, flags)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   816
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   817
        wlock = repo.wlock()
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   818
        try:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   819
            if patch:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   820
                # index, rev, patch
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   821
                info = self.isapplied(patch)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   822
                if not info:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   823
                    patch = self.lookup(patch)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   824
                info = self.isapplied(patch)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   825
                if not info:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   826
                    raise util.Abort(_("patch %s is not applied") % patch)
4100
c30c922f907a Modify qpush/qpop idempotent operations to return success
Ben Thomas <bthomas@virtualiron.com>
parents: 4099
diff changeset
   827
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   828
            if len(self.applied) == 0:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   829
                # Allow qpop -a to work repeatedly,
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   830
                # but not qpop without an argument
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   831
                self.ui.warn(_("no patches applied\n"))
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   832
                return not all
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   833
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   834
            if not update:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   835
                parents = repo.dirstate.parents()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   836
                rr = [ revlog.bin(x.rev) for x in self.applied ]
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   837
                for p in parents:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   838
                    if p in rr:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   839
                        self.ui.warn("qpop: forcing dirstate update\n")
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   840
                        update = True
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   841
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   842
            if not force and update:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   843
                self.check_localchanges(repo)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   844
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   845
            self.applied_dirty = 1;
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   846
            end = len(self.applied)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   847
            if not patch:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   848
                if all:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   849
                    popi = 0
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   850
                else:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   851
                    popi = len(self.applied) - 1
2697
6c540dd14c38 mq: qpop should act like quilt pop
Chris Mason <mason@suse.com>
parents: 2696
diff changeset
   852
            else:
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   853
                popi = info[0] + 1
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   854
                if popi >= end:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   855
                    self.ui.warn("qpop: %s is already at the top\n" % patch)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   856
                    return
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   857
            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
   858
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   859
            start = info[0]
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   860
            rev = revlog.bin(info[1])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   861
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   862
            # we know there are no local changes, so we can make a simplified
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   863
            # form of hg.update.
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   864
            if update:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   865
                top = self.check_toppatch(repo)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   866
                qp = self.qparents(repo, rev)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   867
                changes = repo.changelog.read(qp)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   868
                mmap = repo.manifest.read(changes[0])
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   869
                m, a, r, d, u = repo.status(qp, top)[:5]
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   870
                if d:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   871
                    raise util.Abort("deletions found between repo revs")
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   872
                for f in m:
5140
f6c520fd70cf mq: teach qpop about symlinks
Bryan O'Sullivan <bos@serpentine.com>
parents: 5124
diff changeset
   873
                    getfile(f, mmap[f], mmap.flags(f))
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   874
                for f in r:
5140
f6c520fd70cf mq: teach qpop about symlinks
Bryan O'Sullivan <bos@serpentine.com>
parents: 5124
diff changeset
   875
                    getfile(f, mmap[f], mmap.flags(f))
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   876
                for f in m + r:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   877
                    repo.dirstate.normal(f)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   878
                for f in a:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   879
                    try:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   880
                        os.unlink(repo.wjoin(f))
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   881
                    except OSError, e:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   882
                        if e.errno != errno.ENOENT:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   883
                            raise
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   884
                    try: os.removedirs(os.path.dirname(repo.wjoin(f)))
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   885
                    except: pass
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   886
                    repo.dirstate.forget(f)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   887
                repo.dirstate.setparents(qp, revlog.nullid)
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
   888
            self.strip(repo, rev, update=False, backup='strip')
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   889
            del self.applied[start:end]
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   890
            if len(self.applied):
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   891
                self.ui.write("Now at: %s\n" % self.applied[-1].name)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   892
            else:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   893
                self.ui.write("Patch queue now empty\n")
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   894
        finally:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   895
            del wlock
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   896
2937
9dc568f5e03d Fix test-mq-qdiff; add -I and -X options to qdiff
Brendan Cully <brendan@kublai.com>
parents: 2936
diff changeset
   897
    def diff(self, repo, pats, opts):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   898
        top = self.check_toppatch(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   899
        if not top:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   900
            self.ui.write("No patches applied\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   901
            return
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   902
        qp = self.qparents(repo, top)
3697
da262f35fbc8 add --git option to qdiff
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3692
diff changeset
   903
        if opts.get('git'):
da262f35fbc8 add --git option to qdiff
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3692
diff changeset
   904
            self.diffopts().git = True
2937
9dc568f5e03d Fix test-mq-qdiff; add -I and -X options to qdiff
Brendan Cully <brendan@kublai.com>
parents: 2936
diff changeset
   905
        self.printdiff(repo, qp, files=pats, opts=opts)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   906
2938
5b7a118f5b6c allow qrefresh to take a list of files; closes #96.
Brendan Cully <brendan@kublai.com>
parents: 2937
diff changeset
   907
    def refresh(self, repo, pats=None, **opts):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   908
        if len(self.applied) == 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   909
            self.ui.write("No patches applied\n")
2990
ac74046f8f58 qrefresh: exit with status 1 if no patches applied.
Bryan O'Sullivan <bos@serpentine.com>
parents: 2967
diff changeset
   910
            return 1
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   911
        wlock = repo.wlock()
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   912
        try:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   913
            self.check_toppatch(repo)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   914
            (top, patchfn) = (self.applied[-1].rev, self.applied[-1].name)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   915
            top = revlog.bin(top)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   916
            cparents = repo.changelog.parents(top)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   917
            patchparent = self.qparents(repo, top)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   918
            message, comments, user, date, patchfound = self.readheaders(patchfn)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   919
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   920
            patchf = self.opener(patchfn, 'r+')
4911
fc502517d68d mq: autodetect an existing git patch during qrefresh (issue 491)
Bryan O'Sullivan <bos@serpentine.com>
parents: 4737
diff changeset
   921
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   922
            # if the patch was a git patch, refresh it as a git patch
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   923
            for line in patchf:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   924
                if line.startswith('diff --git'):
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   925
                    self.diffopts().git = True
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   926
                    break
5174
5bbbd1f1d586 mq: truncate patch just before rewriting header
Brendan Cully <brendan@kublai.com>
parents: 4911
diff changeset
   927
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   928
            msg = opts.get('msg', '').rstrip()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   929
            if msg:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   930
                if comments:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   931
                    # Remove existing message.
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   932
                    ci = 0
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   933
                    subj = None
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   934
                    for mi in xrange(len(message)):
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   935
                        if comments[ci].lower().startswith('subject: '):
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   936
                            subj = comments[ci][9:]
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   937
                        while message[mi] != comments[ci] and message[mi] != subj:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   938
                            ci += 1
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   939
                        del comments[ci]
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   940
                comments.append(msg)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   941
5175
f8aa16533ddf Merge with crew-stable
Brendan Cully <brendan@kublai.com>
parents: 5140 5174
diff changeset
   942
            patchf.seek(0)
f8aa16533ddf Merge with crew-stable
Brendan Cully <brendan@kublai.com>
parents: 5140 5174
diff changeset
   943
            patchf.truncate()
f8aa16533ddf Merge with crew-stable
Brendan Cully <brendan@kublai.com>
parents: 5140 5174
diff changeset
   944
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   945
            if comments:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   946
                comments = "\n".join(comments) + '\n\n'
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   947
                patchf.write(comments)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   948
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   949
            if opts.get('git'):
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   950
                self.diffopts().git = True
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   951
            fns, matchfn, anypats = cmdutil.matchpats(repo, pats, opts)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   952
            tip = repo.changelog.tip()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   953
            if top == tip:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   954
                # if the top of our patch queue is also the tip, there is an
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   955
                # optimization here.  We update the dirstate in place and strip
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   956
                # off the tip commit.  Then just commit the current directory
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   957
                # tree.  We can also send repo.commit the list of files
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   958
                # changed to speed up the diff
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   959
                #
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   960
                # in short mode, we only diff the files included in the
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   961
                # patch already
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   962
                #
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   963
                # this should really read:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   964
                #   mm, dd, aa, aa2, uu = repo.status(tip, patchparent)[:5]
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   965
                # but we do it backwards to take advantage of manifest/chlog
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   966
                # caching against the next repo.status call
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   967
                #
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   968
                mm, aa, dd, aa2, uu = repo.status(patchparent, tip)[:5]
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   969
                changes = repo.changelog.read(tip)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   970
                man = repo.manifest.read(changes[0])
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   971
                aaa = aa[:]
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   972
                if opts.get('short'):
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   973
                    filelist = mm + aa + dd
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   974
                    match = dict.fromkeys(filelist).__contains__
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   975
                else:
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   976
                    filelist = None
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   977
                    match = util.always
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   978
                m, a, r, d, u = repo.status(files=filelist, match=match)[:5]
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   979
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   980
                # we might end up with files that were added between
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   981
                # tip and the dirstate parent, but then changed in the
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   982
                # local dirstate. in this case, we want them to only
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   983
                # show up in the added section
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   984
                for x in m:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   985
                    if x not in aa:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   986
                        mm.append(x)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   987
                # we might end up with files added by the local dirstate that
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   988
                # were deleted by the patch.  In this case, they should only
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   989
                # show up in the changed section.
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   990
                for x in a:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   991
                    if x in dd:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   992
                        del dd[dd.index(x)]
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   993
                        mm.append(x)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   994
                    else:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   995
                        aa.append(x)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   996
                # make sure any files deleted in the local dirstate
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   997
                # are not in the add or change column of the patch
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   998
                forget = []
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
   999
                for x in d + r:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1000
                    if x in aa:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1001
                        del aa[aa.index(x)]
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1002
                        forget.append(x)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1003
                        continue
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1004
                    elif x in mm:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1005
                        del mm[mm.index(x)]
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1006
                    dd.append(x)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1007
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1008
                m = util.unique(mm)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1009
                r = util.unique(dd)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1010
                a = util.unique(aa)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1011
                c = [filter(matchfn, l) for l in (m, a, r, [], u)]
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1012
                filelist = util.unique(c[0] + c[1] + c[2])
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1013
                patch.diff(repo, patchparent, files=filelist, match=matchfn,
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1014
                           fp=patchf, changes=c, opts=self.diffopts())
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1015
                patchf.close()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1016
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1017
                repo.dirstate.setparents(*cparents)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1018
                copies = {}
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1019
                for dst in a:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1020
                    src = repo.dirstate.copied(dst)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1021
                    if src is None:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1022
                        continue
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1023
                    copies.setdefault(src, []).append(dst)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1024
                    repo.dirstate.add(dst)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1025
                # remember the copies between patchparent and tip
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1026
                # this may be slow, so don't do it if we're not tracking copies
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1027
                if self.diffopts().git:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1028
                    for dst in aaa:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1029
                        f = repo.file(dst)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1030
                        src = f.renamed(man[dst])
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1031
                        if src:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1032
                            copies[src[0]] = copies.get(dst, [])
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1033
                            if dst in a:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1034
                                copies[src[0]].append(dst)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1035
                        # we can't copy a file created by the patch itself
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1036
                        if dst in copies:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1037
                            del copies[dst]
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1038
                for src, dsts in copies.iteritems():
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1039
                    for dst in dsts:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1040
                        repo.dirstate.copy(src, dst)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1041
                for f in r:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1042
                    repo.dirstate.remove(f)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1043
                # if the patch excludes a modified file, mark that
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1044
                # file with mtime=0 so status can see it.
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1045
                mm = []
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1046
                for i in xrange(len(m)-1, -1, -1):
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1047
                    if not matchfn(m[i]):
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1048
                        mm.append(m[i])
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1049
                        del m[i]
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1050
                for f in m:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1051
                    repo.dirstate.normal(f)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1052
                for f in mm:
5210
90d9ec0dc69d merge: forcefully mark files that we get from the second parent as dirty
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5175
diff changeset
  1053
                    repo.dirstate.normallookup(f)
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1054
                for f in forget:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1055
                    repo.dirstate.forget(f)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1056
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1057
                if not msg:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1058
                    if not message:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1059
                        message = "[mq]: %s\n" % patchfn
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1060
                    else:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1061
                        message = "\n".join(message)
2694
0fb28dbf0dc7 MQ: uniformise message and logfile option.
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2682
diff changeset
  1062
                else:
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1063
                    message = msg
2694
0fb28dbf0dc7 MQ: uniformise message and logfile option.
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2682
diff changeset
  1064
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1065
                self.strip(repo, top, update=False,
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
  1066
                           backup='strip')
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1067
                n = repo.commit(filelist, message, changes[1], match=matchfn,
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
  1068
                                force=1)
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1069
                self.applied[-1] = statusentry(revlog.hex(n), patchfn)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1070
                self.applied_dirty = 1
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1071
                self.removeundo(repo)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1072
            else:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1073
                self.printdiff(repo, patchparent, fp=patchf)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1074
                patchf.close()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1075
                added = repo.status()[1]
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1076
                for a in added:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1077
                    f = repo.wjoin(a)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1078
                    try:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1079
                        os.unlink(f)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1080
                    except OSError, e:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1081
                        if e.errno != errno.ENOENT:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1082
                            raise
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1083
                    try: os.removedirs(os.path.dirname(f))
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1084
                    except: pass
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1085
                    # forget the file copies in the dirstate
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1086
                    # push should readd the files later on
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1087
                    repo.dirstate.forget(a)
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
  1088
                self.pop(repo, force=True)
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
  1089
                self.push(repo, force=True)
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1090
        finally:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1091
            del wlock
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1092
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1093
    def init(self, repo, create=False):
4071
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1094
        if not create and os.path.isdir(self.path):
2711
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2710
diff changeset
  1095
            raise util.Abort(_("patch queue directory already exists"))
4071
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1096
        try:
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1097
            os.mkdir(self.path)
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1098
        except OSError, inst:
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1099
            if inst.errno != errno.EEXIST or not create:
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1100
                raise
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1101
        if create:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1102
            return self.qrepo(create=True)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1103
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1104
    def unapplied(self, repo, patch=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1105
        if patch and patch not in self.series:
2711
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2710
diff changeset
  1106
            raise util.Abort(_("patch %s is not in series file") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1107
        if not patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1108
            start = self.series_end()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1109
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1110
            start = self.series.index(patch) + 1
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1111
        unapplied = []
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1112
        for i in xrange(start, len(self.series)):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1113
            pushable, reason = self.pushable(i)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1114
            if pushable:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1115
                unapplied.append((i, self.series[i]))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1116
            self.explain_pushable(i)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1117
        return unapplied
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1118
4239
417c2068cb92 Simplified qseries and hg qapplied to fix some bugs caused by optimization:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4238
diff changeset
  1119
    def qseries(self, repo, missing=None, start=0, length=None, status=None,
3176
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1120
                summary=False):
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1121
        def displayname(patchname):
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1122
            if summary:
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1123
                msg = self.readheaders(patchname)[0]
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1124
                msg = msg and ': ' + msg[0] or ': '
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1125
            else:
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1126
                msg = ''
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1127
            return '%s%s' % (patchname, msg)
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1128
3763
955475d237fc fix qseries -v and guards interaction
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3708
diff changeset
  1129
        applied = dict.fromkeys([p.name for p in self.applied])
4239
417c2068cb92 Simplified qseries and hg qapplied to fix some bugs caused by optimization:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4238
diff changeset
  1130
        if length is None:
3176
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1131
            length = len(self.series) - start
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1132
        if not missing:
3468
0e68608bd11d use xrange instead of range
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3460
diff changeset
  1133
            for i in xrange(start, start+length):
4239
417c2068cb92 Simplified qseries and hg qapplied to fix some bugs caused by optimization:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4238
diff changeset
  1134
                patch = self.series[i]
417c2068cb92 Simplified qseries and hg qapplied to fix some bugs caused by optimization:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4238
diff changeset
  1135
                if patch in applied:
417c2068cb92 Simplified qseries and hg qapplied to fix some bugs caused by optimization:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4238
diff changeset
  1136
                    stat = 'A'
417c2068cb92 Simplified qseries and hg qapplied to fix some bugs caused by optimization:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4238
diff changeset
  1137
                elif self.pushable(i)[0]:
417c2068cb92 Simplified qseries and hg qapplied to fix some bugs caused by optimization:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4238
diff changeset
  1138
                    stat = 'U'
417c2068cb92 Simplified qseries and hg qapplied to fix some bugs caused by optimization:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4238
diff changeset
  1139
                else:
417c2068cb92 Simplified qseries and hg qapplied to fix some bugs caused by optimization:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4238
diff changeset
  1140
                    stat = 'G'
3176
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1141
                pfx = ''
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1142
                if self.ui.verbose:
3763
955475d237fc fix qseries -v and guards interaction
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3708
diff changeset
  1143
                    pfx = '%d %s ' % (i, stat)
4239
417c2068cb92 Simplified qseries and hg qapplied to fix some bugs caused by optimization:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4238
diff changeset
  1144
                elif status and status != stat:
4238
ce6c364ebb2a Fix issue443: inconsistent output of "hg qunapplied -v"
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4174
diff changeset
  1145
                    continue
3176
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1146
                self.ui.write('%s%s\n' % (pfx, displayname(patch)))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1147
        else:
2789
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2787
diff changeset
  1148
            msng_list = []
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1149
            for root, dirs, files in os.walk(self.path):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1150
                d = root[len(self.path) + 1:]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1151
                for f in files:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1152
                    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
  1153
                    if (fl not in self.series and
4241
7c59ade0f0d6 hg qseries -m: guards file was not ignored
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4239
diff changeset
  1154
                        fl not in (self.status_path, self.series_path,
7c59ade0f0d6 hg qseries -m: guards file was not ignored
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4239
diff changeset
  1155
                                   self.guards_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
  1156
                        and not fl.startswith('.')):
2789
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2787
diff changeset
  1157
                        msng_list.append(fl)
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2787
diff changeset
  1158
            msng_list.sort()
2790
e5e23cae6e09 mq: remove unecessary test
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2789
diff changeset
  1159
            for x in msng_list:
3176
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1160
                pfx = self.ui.verbose and ('D ') or ''
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1161
                self.ui.write("%s%s\n" % (pfx, displayname(x)))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1162
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1163
    def issaveline(self, l):
2805
52516e48e3f3 Update qsave to use StatusEntry; don't throw exception on bad status lines.
Brendan Cully <brendan@kublai.com>
parents: 2804
diff changeset
  1164
        if l.name == '.hg.patches.save.line':
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1165
            return True
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1166
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1167
    def qrepo(self, create=False):
2808
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2807
diff changeset
  1168
        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
  1169
            return hg.repository(self.ui, path=self.path, create=create)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1170
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1171
    def restore(self, repo, rev, delete=None, qupdate=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1172
        c = repo.changelog.read(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1173
        desc = c[4].strip()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1174
        lines = desc.splitlines()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1175
        i = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1176
        datastart = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1177
        series = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1178
        applied = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1179
        qpp = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1180
        for i in xrange(0, len(lines)):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1181
            if lines[i] == 'Patch Data:':
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1182
                datastart = i + 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1183
            elif lines[i].startswith('Dirstate:'):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1184
                l = lines[i].rstrip()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1185
                l = l[10:].split(' ')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1186
                qpp = [ hg.bin(x) for x in l ]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1187
            elif datastart != None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1188
                l = lines[i].rstrip()
2807
bdc067ff6cf5 Make mq camelcase consistent with the rest of hg.
Brendan Cully <brendan@kublai.com>
parents: 2805
diff changeset
  1189
                se = statusentry(l)
2789
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2787
diff changeset
  1190
                file_ = se.name
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2787
diff changeset
  1191
                if se.rev:
2775
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
  1192
                    applied.append(se)
3178
b3e103c388fc mq: don't write applied patches into series twice in restore
Brendan Cully <brendan@kublai.com>
parents: 3177
diff changeset
  1193
                else:
b3e103c388fc mq: don't write applied patches into series twice in restore
Brendan Cully <brendan@kublai.com>
parents: 3177
diff changeset
  1194
                    series.append(file_)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1195
        if datastart == None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1196
            self.ui.warn("No saved patch data found\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1197
            return 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1198
        self.ui.warn("restoring status: %s\n" % lines[0])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1199
        self.full_series = series
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1200
        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
  1201
        self.parse_series()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1202
        self.series_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1203
        self.applied_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1204
        heads = repo.changelog.heads()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1205
        if delete:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1206
            if rev not in heads:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1207
                self.ui.warn("save entry has children, leaving it alone\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1208
            else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1209
                self.ui.warn("removing save entry %s\n" % hg.short(rev))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1210
                pp = repo.dirstate.parents()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1211
                if rev in pp:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1212
                    update = True
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1213
                else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1214
                    update = False
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1215
                self.strip(repo, rev, update=update, backup='strip')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1216
        if qpp:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1217
            self.ui.warn("saved queue repository parents: %s %s\n" %
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1218
                         (hg.short(qpp[0]), hg.short(qpp[1])))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1219
            if qupdate:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1220
                print "queue directory updating"
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1221
                r = self.qrepo()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1222
                if not r:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1223
                    self.ui.warn("Unable to load queue repository\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1224
                    return 1
2822
30f59f4a327e Introduce update helper functions: update, merge, clean, and revert
Matt Mackall <mpm@selenic.com>
parents: 2804
diff changeset
  1225
                hg.clean(r, qpp[0])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1226
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1227
    def save(self, repo, msg=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1228
        if len(self.applied) == 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1229
            self.ui.warn("save: no patches applied, exiting\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1230
            return 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1231
        if self.issaveline(self.applied[-1]):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1232
            self.ui.warn("status is already saved\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1233
            return 1
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1234
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1235
        ar = [ ':' + x for x in self.full_series ]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1236
        if not msg:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1237
            msg = "hg patches saved state"
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1238
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1239
            msg = "hg patches: " + msg.rstrip('\r\n')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1240
        r = self.qrepo()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1241
        if r:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1242
            pp = r.dirstate.parents()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1243
            msg += "\nDirstate: %s %s" % (hg.hex(pp[0]), hg.hex(pp[1]))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1244
        msg += "\n\nPatch Data:\n"
2805
52516e48e3f3 Update qsave to use StatusEntry; don't throw exception on bad status lines.
Brendan Cully <brendan@kublai.com>
parents: 2804
diff changeset
  1245
        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
  1246
                   "\n".join(ar) + '\n' or "")
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1247
        n = repo.commit(None, text, user=None, force=1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1248
        if not n:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1249
            self.ui.warn("repo commit failed\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1250
            return 1
2807
bdc067ff6cf5 Make mq camelcase consistent with the rest of hg.
Brendan Cully <brendan@kublai.com>
parents: 2805
diff changeset
  1251
        self.applied.append(statusentry(revlog.hex(n),'.hg.patches.save.line'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1252
        self.applied_dirty = 1
4209
dbc3846c09a1 Merge with -stable, fix small test failure
Matt Mackall <mpm@selenic.com>
parents: 4202
diff changeset
  1253
        self.removeundo(repo)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1254
2698
c1123e83c8e2 mq: fix qnew and qimport to deal with series file comments
Chris Mason <mason@suse.com>
parents: 2697
diff changeset
  1255
    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
  1256
        if len(self.applied) > 0:
2775
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
  1257
            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
  1258
            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
  1259
            if end == None:
c1123e83c8e2 mq: fix qnew and qimport to deal with series file comments
Chris Mason <mason@suse.com>
parents: 2697
diff changeset
  1260
                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
  1261
            return end + 1
c1123e83c8e2 mq: fix qnew and qimport to deal with series file comments
Chris Mason <mason@suse.com>
parents: 2697
diff changeset
  1262
        return 0
c1123e83c8e2 mq: fix qnew and qimport to deal with series file comments
Chris Mason <mason@suse.com>
parents: 2697
diff changeset
  1263
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1264
    def series_end(self, all_patches=False):
4408
f700ea2b0689 mq: fix qtop failure when the series ends with guarded patches.
Patrick Mezard <pmezard@gmail.com>
parents: 4338
diff changeset
  1265
        """If all_patches is False, return the index of the next pushable patch
f700ea2b0689 mq: fix qtop failure when the series ends with guarded patches.
Patrick Mezard <pmezard@gmail.com>
parents: 4338
diff changeset
  1266
        in the series, or the series length. If all_patches is True, return the
f700ea2b0689 mq: fix qtop failure when the series ends with guarded patches.
Patrick Mezard <pmezard@gmail.com>
parents: 4338
diff changeset
  1267
        index of the first patch past the last applied one.
f700ea2b0689 mq: fix qtop failure when the series ends with guarded patches.
Patrick Mezard <pmezard@gmail.com>
parents: 4338
diff changeset
  1268
        """
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1269
        end = 0
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1270
        def next(start):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1271
            if all_patches:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1272
                return start
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1273
            i = start
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1274
            while i < len(self.series):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1275
                p, reason = self.pushable(i)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1276
                if p:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1277
                    break
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1278
                self.explain_pushable(i)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1279
                i += 1
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1280
            return i
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1281
        if len(self.applied) > 0:
2775
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
  1282
            p = self.applied[-1].name
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1283
            try:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1284
                end = self.series.index(p)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1285
            except ValueError:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1286
                return 0
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1287
            return next(end + 1)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1288
        return next(end)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1289
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1290
    def appliedname(self, index):
2775
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
  1291
        pname = self.applied[index].name
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1292
        if not self.ui.verbose:
2677
ec05ce9cbf47 mq: uniform verbose display of patche[s].
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2664
diff changeset
  1293
            p = pname
ec05ce9cbf47 mq: uniform verbose display of patche[s].
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2664
diff changeset
  1294
        else:
2941
d32df6452323 mq: fix appliedname
Brendan Cully <brendan@kublai.com>
parents: 2940
diff changeset
  1295
            p = str(self.series.index(pname)) + " " + pname
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1296
        return p
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1297
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1298
    def qimport(self, repo, files, patchname=None, rev=None, existing=None,
3691
79151c94c3b4 mq: add --git option to qimport -r
Brendan Cully <brendan@kublai.com>
parents: 3685
diff changeset
  1299
                force=None, git=False):
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1300
        def checkseries(patchname):
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1301
            if patchname in self.series:
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1302
                raise util.Abort(_('patch %s is already in the series file')
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1303
                                 % patchname)
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1304
        def checkfile(patchname):
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1305
            if not force and os.path.exists(self.join(patchname)):
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1306
                raise util.Abort(_('patch "%s" already exists')
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1307
                                 % patchname)
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1308
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1309
        if rev:
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1310
            if files:
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1311
                raise util.Abort(_('option "-r" not valid when importing '
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1312
                                   'files'))
3707
67f44b825784 Removed unused ui parameter from revpair/revrange and fix its users.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3700
diff changeset
  1313
            rev = cmdutil.revrange(repo, rev)
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1314
            rev.sort(lambda x, y: cmp(y, x))
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1315
        if (len(files) > 1 or len(rev) > 1) and patchname:
2711
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2710
diff changeset
  1316
            raise util.Abort(_('option "-n" not valid when importing multiple '
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1317
                               'patches'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1318
        i = 0
2488
2785aeb51be4 mq: add qimported patches if patch dir is a repo
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2301
diff changeset
  1319
        added = []
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1320
        if rev:
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1321
            # If mq patches are applied, we can only import revisions
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1322
            # that form a linear path to qbase.
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1323
            # Otherwise, they should form a linear path to a head.
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1324
            heads = repo.changelog.heads(repo.changelog.node(rev[-1]))
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1325
            if len(heads) > 1:
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1326
                raise util.Abort(_('revision %d is the root of more than one '
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1327
                                   'branch') % rev[-1])
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1328
            if self.applied:
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1329
                base = revlog.hex(repo.changelog.node(rev[0]))
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1330
                if base in [n.rev for n in self.applied]:
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1331
                    raise util.Abort(_('revision %d is already managed')
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1332
                                     % rev[0])
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1333
                if heads != [revlog.bin(self.applied[-1].rev)]:
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1334
                    raise util.Abort(_('revision %d is not the parent of '
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1335
                                       'the queue') % rev[0])
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1336
                base = repo.changelog.rev(revlog.bin(self.applied[0].rev))
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1337
                lastparent = repo.changelog.parentrevs(base)[0]
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1338
            else:
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1339
                if heads != [repo.changelog.node(rev[0])]:
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1340
                    raise util.Abort(_('revision %d has unmanaged children')
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1341
                                     % rev[0])
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1342
                lastparent = None
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1343
3691
79151c94c3b4 mq: add --git option to qimport -r
Brendan Cully <brendan@kublai.com>
parents: 3685
diff changeset
  1344
            if git:
79151c94c3b4 mq: add --git option to qimport -r
Brendan Cully <brendan@kublai.com>
parents: 3685
diff changeset
  1345
                self.diffopts().git = True
79151c94c3b4 mq: add --git option to qimport -r
Brendan Cully <brendan@kublai.com>
parents: 3685
diff changeset
  1346
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1347
            for r in rev:
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1348
                p1, p2 = repo.changelog.parentrevs(r)
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1349
                n = repo.changelog.node(r)
3578
3b4e00cba57a Define and use nullrev (revision of nullid) instead of -1.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3568
diff changeset
  1350
                if p2 != revlog.nullrev:
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1351
                    raise util.Abort(_('cannot import merge revision %d') % r)
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1352
                if lastparent and lastparent != r:
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1353
                    raise util.Abort(_('revision %d is not the parent of %d')
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1354
                                     % (r, lastparent))
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1355
                lastparent = p1
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1356
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1357
                if not patchname:
4037
bbdba01cce28 Enforce unixish style for all generated patch names.
Patrick Mezard <pmezard@gmail.com>
parents: 4016
diff changeset
  1358
                    patchname = normname('%d.diff' % r)
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1359
                checkseries(patchname)
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1360
                checkfile(patchname)
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1361
                self.full_series.insert(0, patchname)
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1362
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1363
                patchf = self.opener(patchname, "w")
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1364
                patch.export(repo, [n], fp=patchf, opts=self.diffopts())
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1365
                patchf.close()
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1366
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1367
                se = statusentry(revlog.hex(n), patchname)
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1368
                self.applied.insert(0, se)
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1369
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1370
                added.append(patchname)
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1371
                patchname = None
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1372
            self.parse_series()
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1373
            self.applied_dirty = 1
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1374
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1375
        for filename in files:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1376
            if existing:
3533
891c8d20f80f mq: support qimport -
Brendan Cully <brendan@kublai.com>
parents: 3486
diff changeset
  1377
                if filename == '-':
891c8d20f80f mq: support qimport -
Brendan Cully <brendan@kublai.com>
parents: 3486
diff changeset
  1378
                    raise util.Abort(_('-e is incompatible with import from -'))
3128
15fde1970003 qimport: rename patch to patchname to avoid shadowing module
Brendan Cully <brendan@kublai.com>
parents: 3088
diff changeset
  1379
                if not patchname:
4037
bbdba01cce28 Enforce unixish style for all generated patch names.
Patrick Mezard <pmezard@gmail.com>
parents: 4016
diff changeset
  1380
                    patchname = normname(filename)
3128
15fde1970003 qimport: rename patch to patchname to avoid shadowing module
Brendan Cully <brendan@kublai.com>
parents: 3088
diff changeset
  1381
                if not os.path.isfile(self.join(patchname)):
15fde1970003 qimport: rename patch to patchname to avoid shadowing module
Brendan Cully <brendan@kublai.com>
parents: 3088
diff changeset
  1382
                    raise util.Abort(_("patch %s does not exist") % patchname)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1383
            else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1384
                try:
3533
891c8d20f80f mq: support qimport -
Brendan Cully <brendan@kublai.com>
parents: 3486
diff changeset
  1385
                    if filename == '-':
891c8d20f80f mq: support qimport -
Brendan Cully <brendan@kublai.com>
parents: 3486
diff changeset
  1386
                        if not patchname:
891c8d20f80f mq: support qimport -
Brendan Cully <brendan@kublai.com>
parents: 3486
diff changeset
  1387
                            raise util.Abort(_('need --name to import a patch from -'))
891c8d20f80f mq: support qimport -
Brendan Cully <brendan@kublai.com>
parents: 3486
diff changeset
  1388
                        text = sys.stdin.read()
891c8d20f80f mq: support qimport -
Brendan Cully <brendan@kublai.com>
parents: 3486
diff changeset
  1389
                    else:
891c8d20f80f mq: support qimport -
Brendan Cully <brendan@kublai.com>
parents: 3486
diff changeset
  1390
                        text = file(filename).read()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1391
                except IOError:
3128
15fde1970003 qimport: rename patch to patchname to avoid shadowing module
Brendan Cully <brendan@kublai.com>
parents: 3088
diff changeset
  1392
                    raise util.Abort(_("unable to read %s") % patchname)
15fde1970003 qimport: rename patch to patchname to avoid shadowing module
Brendan Cully <brendan@kublai.com>
parents: 3088
diff changeset
  1393
                if not patchname:
4037
bbdba01cce28 Enforce unixish style for all generated patch names.
Patrick Mezard <pmezard@gmail.com>
parents: 4016
diff changeset
  1394
                    patchname = normname(os.path.basename(filename))
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1395
                checkfile(patchname)
3128
15fde1970003 qimport: rename patch to patchname to avoid shadowing module
Brendan Cully <brendan@kublai.com>
parents: 3088
diff changeset
  1396
                patchf = self.opener(patchname, "w")
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1397
                patchf.write(text)
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1398
            checkseries(patchname)
2698
c1123e83c8e2 mq: fix qnew and qimport to deal with series file comments
Chris Mason <mason@suse.com>
parents: 2697
diff changeset
  1399
            index = self.full_series_end() + i
3128
15fde1970003 qimport: rename patch to patchname to avoid shadowing module
Brendan Cully <brendan@kublai.com>
parents: 3088
diff changeset
  1400
            self.full_series[index:index] = [patchname]
2767
60683ab1ed33 mq: rename read_series as parse_series, make simpler and faster
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2766
diff changeset
  1401
            self.parse_series()
3128
15fde1970003 qimport: rename patch to patchname to avoid shadowing module
Brendan Cully <brendan@kublai.com>
parents: 3088
diff changeset
  1402
            self.ui.warn("adding %s to series file\n" % patchname)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1403
            i += 1
3128
15fde1970003 qimport: rename patch to patchname to avoid shadowing module
Brendan Cully <brendan@kublai.com>
parents: 3088
diff changeset
  1404
            added.append(patchname)
15fde1970003 qimport: rename patch to patchname to avoid shadowing module
Brendan Cully <brendan@kublai.com>
parents: 3088
diff changeset
  1405
            patchname = None
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1406
        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
  1407
        qrepo = self.qrepo()
2785aeb51be4 mq: add qimported patches if patch dir is a repo
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2301
diff changeset
  1408
        if qrepo:
2785aeb51be4 mq: add qimported patches if patch dir is a repo
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2301
diff changeset
  1409
            qrepo.add(added)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1410
3371
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
  1411
def delete(ui, repo, *patches, **opts):
2890
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2889
diff changeset
  1412
    """remove patches from queue
2752
5dfeda163bb7 Add -f option to qdelete, to remove patch file.
Brendan Cully <brendan@kublai.com>
parents: 2751
diff changeset
  1413
4737
2ececafa5859 mq: more qdelete help text tweaks
Brendan Cully <brendan@kublai.com>
parents: 4736
diff changeset
  1414
    The patches must not be applied, unless they are arguments to
2ececafa5859 mq: more qdelete help text tweaks
Brendan Cully <brendan@kublai.com>
parents: 4736
diff changeset
  1415
    the --rev parameter. At least one patch or revision is required.
3085
dc784839516d mq: add qdelete --forget option
Brendan Cully <brendan@kublai.com>
parents: 3084
diff changeset
  1416
4737
2ececafa5859 mq: more qdelete help text tweaks
Brendan Cully <brendan@kublai.com>
parents: 4736
diff changeset
  1417
    With --rev, mq will stop managing the named revisions (converting
2ececafa5859 mq: more qdelete help text tweaks
Brendan Cully <brendan@kublai.com>
parents: 4736
diff changeset
  1418
    them to regular mercurial changesets). The patches must be applied
2ececafa5859 mq: more qdelete help text tweaks
Brendan Cully <brendan@kublai.com>
parents: 4736
diff changeset
  1419
    and at the base of the stack. This option is useful when the patches
2ececafa5859 mq: more qdelete help text tweaks
Brendan Cully <brendan@kublai.com>
parents: 4736
diff changeset
  1420
    have been applied upstream.
3085
dc784839516d mq: add qdelete --forget option
Brendan Cully <brendan@kublai.com>
parents: 3084
diff changeset
  1421
dc784839516d mq: add qdelete --forget option
Brendan Cully <brendan@kublai.com>
parents: 3084
diff changeset
  1422
    With --keep, the patch files are 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
  1423
    q = repo.mq
3371
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
  1424
    q.delete(repo, patches, opts)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1425
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1426
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1427
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1428
def applied(ui, repo, patch=None, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1429
    """print the patches already applied"""
3176
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1430
    q = repo.mq
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1431
    if patch:
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1432
        if patch not in q.series:
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1433
            raise util.Abort(_("patch %s is not in series file") % patch)
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1434
        end = q.series.index(patch) + 1
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1435
    else:
4239
417c2068cb92 Simplified qseries and hg qapplied to fix some bugs caused by optimization:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4238
diff changeset
  1436
        end = q.series_end(True)
3176
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1437
    return q.qseries(repo, length=end, status='A', summary=opts.get('summary'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1438
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1439
def unapplied(ui, repo, patch=None, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1440
    """print the patches not yet applied"""
3176
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1441
    q = repo.mq
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1442
    if patch:
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1443
        if patch not in q.series:
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1444
            raise util.Abort(_("patch %s is not in series file") % patch)
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1445
        start = q.series.index(patch) + 1
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1446
    else:
4238
ce6c364ebb2a Fix issue443: inconsistent output of "hg qunapplied -v"
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4174
diff changeset
  1447
        start = q.series_end(True)
ce6c364ebb2a Fix issue443: inconsistent output of "hg qunapplied -v"
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4174
diff changeset
  1448
    q.qseries(repo, start=start, status='U', summary=opts.get('summary'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1449
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1450
def qimport(ui, repo, *filename, **opts):
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1451
    """import a patch
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1452
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1453
    The patch will have the same name as its source file unless you
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1454
    give it a new one with --name.
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1455
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1456
    You can register an existing patch inside the patch directory
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1457
    with the --existing flag.
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1458
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1459
    With --force, an existing patch of the same name will be overwritten.
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1460
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1461
    An existing changeset may be placed under mq control with --rev
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1462
    (e.g. qimport --rev tip -n patch will place tip under mq control).
3691
79151c94c3b4 mq: add --git option to qimport -r
Brendan Cully <brendan@kublai.com>
parents: 3685
diff changeset
  1463
    With --git, patches imported with --rev will use the git diff
79151c94c3b4 mq: add --git option to qimport -r
Brendan Cully <brendan@kublai.com>
parents: 3685
diff changeset
  1464
    format.
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  1465
    """
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  1466
    q = repo.mq
3128
15fde1970003 qimport: rename patch to patchname to avoid shadowing module
Brendan Cully <brendan@kublai.com>
parents: 3088
diff changeset
  1467
    q.qimport(repo, filename, patchname=opts['name'],
3691
79151c94c3b4 mq: add --git option to qimport -r
Brendan Cully <brendan@kublai.com>
parents: 3685
diff changeset
  1468
              existing=opts['existing'], force=opts['force'], rev=opts['rev'],
79151c94c3b4 mq: add --git option to qimport -r
Brendan Cully <brendan@kublai.com>
parents: 3685
diff changeset
  1469
              git=opts['git'])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1470
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1471
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1472
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1473
def init(ui, repo, **opts):
2754
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  1474
    """init a new queue repository
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  1475
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  1476
    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
  1477
    specified, qinit will create a separate nested repository
4711
c71bf1d251ad mq: document that qinit -c may be run later
Brendan Cully <brendan@kublai.com>
parents: 4614
diff changeset
  1478
    for patches (qinit -c may also be run later to convert
c71bf1d251ad mq: document that qinit -c may be run later
Brendan Cully <brendan@kublai.com>
parents: 4614
diff changeset
  1479
    an unversioned patch repository into a versioned one).
c71bf1d251ad mq: document that qinit -c may be run later
Brendan Cully <brendan@kublai.com>
parents: 4614
diff changeset
  1480
    You can use qcommit to commit changes to this queue repository."""
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  1481
    q = repo.mq
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1482
    r = q.init(repo, create=opts['create_repo'])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1483
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1484
    if r:
4071
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1485
        if not os.path.exists(r.wjoin('.hgignore')):
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1486
            fp = r.wopener('.hgignore', 'w')
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1487
            fp.write('syntax: glob\n')
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1488
            fp.write('status\n')
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1489
            fp.write('guards\n')
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1490
            fp.close()
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1491
        if not os.path.exists(r.wjoin('series')):
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1492
            r.wopener('series', 'w').close()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1493
        r.add(['.hgignore', 'series'])
4071
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1494
        commands.add(ui, r)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1495
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1496
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1497
def clone(ui, source, dest=None, **opts):
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1498
    '''clone main and patch repository at same time
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1499
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1500
    If source is local, destination will have no patches applied.  If
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1501
    source is remote, this command can not check if patches are
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1502
    applied in source, so cannot guarantee that patches are not
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1503
    applied in destination.  If you clone remote repository, be sure
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1504
    before that it has no patches applied.
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1505
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1506
    Source patch repository is looked for in <src>/.hg/patches by
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1507
    default.  Use -p <url> to change.
4852
cba10652a901 mq: improve qclone error handling when patch directory is not a repository.
Brendan Cully <brendan@kublai.com>
parents: 4737
diff changeset
  1508
cba10652a901 mq: improve qclone error handling when patch directory is not a repository.
Brendan Cully <brendan@kublai.com>
parents: 4737
diff changeset
  1509
    The patch directory must be a nested mercurial repository, as
cba10652a901 mq: improve qclone error handling when patch directory is not a repository.
Brendan Cully <brendan@kublai.com>
parents: 4737
diff changeset
  1510
    would be created by qinit -c.
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1511
    '''
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4476
diff changeset
  1512
    cmdutil.setremoteconfig(ui, opts)
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1513
    if dest is None:
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1514
        dest = hg.defaultdest(source)
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1515
    sr = hg.repository(ui, ui.expandpath(source))
4852
cba10652a901 mq: improve qclone error handling when patch directory is not a repository.
Brendan Cully <brendan@kublai.com>
parents: 4737
diff changeset
  1516
    patchdir = opts['patches'] or (sr.url() + '/.hg/patches')
cba10652a901 mq: improve qclone error handling when patch directory is not a repository.
Brendan Cully <brendan@kublai.com>
parents: 4737
diff changeset
  1517
    try:
cba10652a901 mq: improve qclone error handling when patch directory is not a repository.
Brendan Cully <brendan@kublai.com>
parents: 4737
diff changeset
  1518
        pr = hg.repository(ui, patchdir)
cba10652a901 mq: improve qclone error handling when patch directory is not a repository.
Brendan Cully <brendan@kublai.com>
parents: 4737
diff changeset
  1519
    except hg.RepoError:
cba10652a901 mq: improve qclone error handling when patch directory is not a repository.
Brendan Cully <brendan@kublai.com>
parents: 4737
diff changeset
  1520
        raise util.Abort(_('versioned patch repository not found'
cba10652a901 mq: improve qclone error handling when patch directory is not a repository.
Brendan Cully <brendan@kublai.com>
parents: 4737
diff changeset
  1521
                           ' (see qinit -c)'))
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1522
    qbase, destrev = None, None
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1523
    if sr.local():
2725
9ffee4f07323 mq: update to handle repomap not longer used
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2724
diff changeset
  1524
        if sr.mq.applied:
2775
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
  1525
            qbase = revlog.bin(sr.mq.applied[0].rev)
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1526
            if not hg.islocal(dest):
4172
1df1baf2002e fix qclone to a remote repo
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4133
diff changeset
  1527
                heads = dict.fromkeys(sr.heads())
1df1baf2002e fix qclone to a remote repo
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4133
diff changeset
  1528
                for h in sr.heads(qbase):
1df1baf2002e fix qclone to a remote repo
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4133
diff changeset
  1529
                    del heads[h]
1df1baf2002e fix qclone to a remote repo
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4133
diff changeset
  1530
                destrev = heads.keys()
1df1baf2002e fix qclone to a remote repo
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4133
diff changeset
  1531
                destrev.append(sr.changelog.parents(qbase)[0])
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1532
    ui.note(_('cloning main repo\n'))
4476
4ef8fdf57e39 mq: pass a URL to clone
Matt Mackall <mpm@selenic.com>
parents: 4437
diff changeset
  1533
    sr, dr = hg.clone(ui, sr.url(), dest,
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1534
                      pull=opts['pull'],
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1535
                      rev=destrev,
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1536
                      update=False,
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1537
                      stream=opts['uncompressed'])
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1538
    ui.note(_('cloning patch repo\n'))
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1539
    spr, dpr = hg.clone(ui, opts['patches'] or (sr.url() + '/.hg/patches'),
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1540
                        dr.url() + '/.hg/patches',
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1541
                        pull=opts['pull'],
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1542
                        update=not opts['noupdate'],
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1543
                        stream=opts['uncompressed'])
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1544
    if dr.local():
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1545
        if qbase:
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1546
            ui.note(_('stripping applied patches from destination repo\n'))
2725
9ffee4f07323 mq: update to handle repomap not longer used
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2724
diff changeset
  1547
            dr.mq.strip(dr, qbase, update=False, backup=None)
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1548
        if not opts['noupdate']:
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1549
            ui.note(_('updating destination repo\n'))
2799
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents: 2772
diff changeset
  1550
            hg.update(dr, dr.changelog.tip())
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2712
diff changeset
  1551
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1552
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
  1553
    """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
  1554
    q = repo.mq
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1555
    r = q.qrepo()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1556
    if not r: raise util.Abort('no queue repository')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1557
    commands.commit(r.ui, r, *pats, **opts)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1558
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1559
def series(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1560
    """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
  1561
    repo.mq.qseries(repo, missing=opts['missing'], summary=opts['summary'])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1562
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1563
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1564
def top(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1565
    """print the name of the current patch"""
3176
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1566
    q = repo.mq
4408
f700ea2b0689 mq: fix qtop failure when the series ends with guarded patches.
Patrick Mezard <pmezard@gmail.com>
parents: 4338
diff changeset
  1567
    t = q.applied and q.series_end(True) or 0
3176
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1568
    if t:
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1569
        return q.qseries(repo, start=t-1, length=1, status='A',
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1570
                         summary=opts.get('summary'))
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1571
    else:
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1572
        ui.write("No patches applied\n")
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1573
        return 1
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1574
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1575
def next(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1576
    """print the name of the next patch"""
3176
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1577
    q = repo.mq
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1578
    end = q.series_end()
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1579
    if end == len(q.series):
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1580
        ui.write("All patches applied\n")
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1581
        return 1
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1582
    return q.qseries(repo, start=end, length=1, summary=opts.get('summary'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1583
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1584
def prev(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1585
    """print the name of the previous patch"""
3176
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1586
    q = repo.mq
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1587
    l = len(q.applied)
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1588
    if l == 1:
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1589
        ui.write("Only one patch applied\n")
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1590
        return 1
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1591
    if not l:
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1592
        ui.write("No patches applied\n")
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1593
        return 1
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1594
    return q.qseries(repo, start=l-2, length=1, status='A',
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1595
                     summary=opts.get('summary'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1596
4713
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
  1597
def new(ui, repo, patch, *args, **opts):
2754
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  1598
    """create a new patch
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  1599
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  1600
    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
  1601
    (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
  1602
    changes unless -f is specified, in which case the patch will
4713
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
  1603
    be initialised with them. You may also use -I, -X, and/or a list of
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
  1604
    files after the patch name to add only changes to matching files
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
  1605
    to the new patch, leaving the rest as uncommitted modifications.
2754
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  1606
2939
abd0be815c9c Add qnew -e option.
Brendan Cully <brendan@kublai.com>
parents: 2938
diff changeset
  1607
    -e, -m or -l set the patch header as well as the commit message.
abd0be815c9c Add qnew -e option.
Brendan Cully <brendan@kublai.com>
parents: 2938
diff changeset
  1608
    If none is specified, the patch header is empty and the
4722
487943b52a6c mq: regularize patch header creation.
Brendan Cully <brendan@kublai.com>
parents: 4713
diff changeset
  1609
    commit message is '[mq]: PATCH'"""
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  1610
    q = repo.mq
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4476
diff changeset
  1611
    message = cmdutil.logmessage(opts)
2939
abd0be815c9c Add qnew -e option.
Brendan Cully <brendan@kublai.com>
parents: 2938
diff changeset
  1612
    if opts['edit']:
abd0be815c9c Add qnew -e option.
Brendan Cully <brendan@kublai.com>
parents: 2938
diff changeset
  1613
        message = ui.edit(message, ui.username())
4713
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
  1614
    opts['msg'] = message
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
  1615
    q.new(repo, patch, *args, **opts)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1616
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1617
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1618
2938
5b7a118f5b6c allow qrefresh to take a list of files; closes #96.
Brendan Cully <brendan@kublai.com>
parents: 2937
diff changeset
  1619
def refresh(ui, repo, *pats, **opts):
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1620
    """update the current patch
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1621
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1622
    If any file patterns are provided, the refreshed patch will contain only
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1623
    the modifications that match those patterns; the remaining modifications
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1624
    will remain in the working directory.
4048
5d6b3fa62736 mq: Mention usage of hg add/remove/copy/rename in qrefresh help text.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4039
diff changeset
  1625
5d6b3fa62736 mq: Mention usage of hg add/remove/copy/rename in qrefresh help text.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4039
diff changeset
  1626
    hg add/remove/copy/rename work as usual, though you might want to use
5d6b3fa62736 mq: Mention usage of hg add/remove/copy/rename in qrefresh help text.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4039
diff changeset
  1627
    git-style patches (--git or [diff] git=1) to track copies and renames.
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1628
    """
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  1629
    q = repo.mq
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4476
diff changeset
  1630
    message = cmdutil.logmessage(opts)
2746
0503eb5c0a33 Add option -e/--edit to qrefresh, to edit the existing header.
Brendan Cully <brendan@kublai.com>
parents: 2745
diff changeset
  1631
    if opts['edit']:
0503eb5c0a33 Add option -e/--edit to qrefresh, to edit the existing header.
Brendan Cully <brendan@kublai.com>
parents: 2745
diff changeset
  1632
        if message:
0503eb5c0a33 Add option -e/--edit to qrefresh, to edit the existing header.
Brendan Cully <brendan@kublai.com>
parents: 2745
diff changeset
  1633
            raise util.Abort(_('option "-e" incompatible with "-m" or "-l"'))
2775
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
  1634
        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
  1635
        (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
  1636
        message = ui.edit('\n'.join(message), user or ui.username())
2990
ac74046f8f58 qrefresh: exit with status 1 if no patches applied.
Bryan O'Sullivan <bos@serpentine.com>
parents: 2967
diff changeset
  1637
    ret = q.refresh(repo, pats, msg=message, **opts)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1638
    q.save_dirty()
2990
ac74046f8f58 qrefresh: exit with status 1 if no patches applied.
Bryan O'Sullivan <bos@serpentine.com>
parents: 2967
diff changeset
  1639
    return ret
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1640
2937
9dc568f5e03d Fix test-mq-qdiff; add -I and -X options to qdiff
Brendan Cully <brendan@kublai.com>
parents: 2936
diff changeset
  1641
def diff(ui, repo, *pats, **opts):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1642
    """diff of the current patch"""
2937
9dc568f5e03d Fix test-mq-qdiff; add -I and -X options to qdiff
Brendan Cully <brendan@kublai.com>
parents: 2936
diff changeset
  1643
    repo.mq.diff(repo, pats, opts)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1644
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1645
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1646
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
  1647
    """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
  1648
2771
519bf0cd28d2 Add -f option to qfold; improve qfold documentation.
Brendan Cully <brendan@kublai.com>
parents: 2770
diff changeset
  1649
    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
  1650
    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
  1651
    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
  1652
    with the new cumulative patch, and the folded patches will
2889
57b88b86a845 Replace qdel/qfold -f option with -k/--keep.
Brendan Cully <brendan@kublai.com>
parents: 2882
diff changeset
  1653
    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
  1654
    be removed afterwards.
519bf0cd28d2 Add -f option to qfold; improve qfold documentation.
Brendan Cully <brendan@kublai.com>
parents: 2770
diff changeset
  1655
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1656
    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
  1657
    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
  1658
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1659
    q = repo.mq
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1660
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1661
    if not files:
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1662
        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
  1663
    if not q.check_toppatch(repo):
3069
bc3fe3b5b785 Never apply string formatting to generated errors with util.Abort.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3024
diff changeset
  1664
        raise util.Abort(_('No patches applied'))
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1665
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4476
diff changeset
  1666
    message = cmdutil.logmessage(opts)
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1667
    if opts['edit']:
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1668
        if message:
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1669
            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
  1670
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1671
    parent = q.lookup('qtip')
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1672
    patches = []
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1673
    messages = []
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1674
    for f in files:
2936
21bf8929efc8 Fix qfold after recent changes
Brendan Cully <brendan@kublai.com>
parents: 2934
diff changeset
  1675
        p = q.lookup(f)
21bf8929efc8 Fix qfold after recent changes
Brendan Cully <brendan@kublai.com>
parents: 2934
diff changeset
  1676
        if p in patches or p == parent:
21bf8929efc8 Fix qfold after recent changes
Brendan Cully <brendan@kublai.com>
parents: 2934
diff changeset
  1677
            ui.warn(_('Skipping already folded patch %s') % p)
21bf8929efc8 Fix qfold after recent changes
Brendan Cully <brendan@kublai.com>
parents: 2934
diff changeset
  1678
        if q.isapplied(p):
21bf8929efc8 Fix qfold after recent changes
Brendan Cully <brendan@kublai.com>
parents: 2934
diff changeset
  1679
            raise util.Abort(_('qfold cannot fold already applied patch %s') % p)
21bf8929efc8 Fix qfold after recent changes
Brendan Cully <brendan@kublai.com>
parents: 2934
diff changeset
  1680
        patches.append(p)
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1681
2936
21bf8929efc8 Fix qfold after recent changes
Brendan Cully <brendan@kublai.com>
parents: 2934
diff changeset
  1682
    for p in patches:
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1683
        if not message:
2936
21bf8929efc8 Fix qfold after recent changes
Brendan Cully <brendan@kublai.com>
parents: 2934
diff changeset
  1684
            messages.append(q.readheaders(p)[0])
21bf8929efc8 Fix qfold after recent changes
Brendan Cully <brendan@kublai.com>
parents: 2934
diff changeset
  1685
        pf = q.join(p)
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1686
        (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
  1687
        if not patchsuccess:
2936
21bf8929efc8 Fix qfold after recent changes
Brendan Cully <brendan@kublai.com>
parents: 2934
diff changeset
  1688
            raise util.Abort(_('Error folding patch %s') % p)
21bf8929efc8 Fix qfold after recent changes
Brendan Cully <brendan@kublai.com>
parents: 2934
diff changeset
  1689
        patch.updatedir(ui, repo, files)
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1690
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1691
    if not message:
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1692
        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
  1693
        for msg in messages:
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1694
            message.append('* * *')
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1695
            message.extend(msg)
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1696
        message = '\n'.join(message)
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1697
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1698
    if opts['edit']:
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1699
        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
  1700
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1701
    q.refresh(repo, msg=message)
3243
1d3aceae87c1 mq: update qfold to call delete correctly
Brendan Cully <brendan@kublai.com>
parents: 3215
diff changeset
  1702
    q.delete(repo, patches, opts)
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1703
    q.save_dirty()
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  1704
4432
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  1705
def goto(ui, repo, patch, **opts):
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  1706
    '''push or pop patches until named patch is at top of stack'''
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  1707
    q = repo.mq
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  1708
    patch = q.lookup(patch)
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  1709
    if q.isapplied(patch):
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  1710
        ret = q.pop(repo, patch, force=opts['force'])
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  1711
    else:
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  1712
        ret = q.push(repo, patch, force=opts['force'])
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  1713
    q.save_dirty()
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  1714
    return ret
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  1715
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1716
def guard(ui, repo, *args, **opts):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1717
    '''set or print guards for a patch
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1718
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1719
    Guards control whether a patch can be pushed. A patch with no
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1720
    guards is always pushed. A patch with a positive guard ("+foo") is
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1721
    pushed only if the qselect command has activated it. A patch with
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1722
    a negative guard ("-foo") is never pushed if the qselect command
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1723
    has activated it.
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1724
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1725
    With no arguments, print the currently active guards.
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1726
    With arguments, set guards for the named patch.
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1727
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1728
    To set a negative guard "-foo" on topmost patch ("--" is needed so
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1729
    hg will not interpret "-foo" as an option):
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1730
      hg qguard -- -foo
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1731
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1732
    To set guards on another patch:
3215
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3179
diff changeset
  1733
      hg qguard other.patch +2.6.17 -stable
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1734
    '''
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1735
    def status(idx):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1736
        guards = q.series_guards[idx] or ['unguarded']
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1737
        ui.write('%s: %s\n' % (q.series[idx], ' '.join(guards)))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1738
    q = repo.mq
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1739
    patch = None
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1740
    args = list(args)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1741
    if opts['list']:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1742
        if args or opts['none']:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1743
            raise util.Abort(_('cannot mix -l/--list with options or arguments'))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1744
        for i in xrange(len(q.series)):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1745
            status(i)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1746
        return
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1747
    if not args or args[0][0:1] in '-+':
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1748
        if not q.applied:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1749
            raise util.Abort(_('no patches applied'))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1750
        patch = q.applied[-1].name
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1751
    if patch is None and args[0][0:1] not in '-+':
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1752
        patch = args.pop(0)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1753
    if patch is None:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1754
        raise util.Abort(_('no patch to work with'))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1755
    if args or opts['none']:
4133
a9ee6c53af8d mq: abort cleanly when invalid patch name is given to qguard
Christian Ebert <blacktrash@gmx.net>
parents: 4090
diff changeset
  1756
        idx = q.find_series(patch)
a9ee6c53af8d mq: abort cleanly when invalid patch name is given to qguard
Christian Ebert <blacktrash@gmx.net>
parents: 4090
diff changeset
  1757
        if idx is None:
a9ee6c53af8d mq: abort cleanly when invalid patch name is given to qguard
Christian Ebert <blacktrash@gmx.net>
parents: 4090
diff changeset
  1758
            raise util.Abort(_('no patch named %s') % patch)
a9ee6c53af8d mq: abort cleanly when invalid patch name is given to qguard
Christian Ebert <blacktrash@gmx.net>
parents: 4090
diff changeset
  1759
        q.set_guards(idx, args)
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1760
        q.save_dirty()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1761
    else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1762
        status(q.series.index(q.lookup(patch)))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1763
2747
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  1764
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
  1765
    """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
  1766
    q = repo.mq
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  1767
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  1768
    if patch:
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  1769
        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
  1770
    else:
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  1771
        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
  1772
            ui.write('No patches applied\n')
2994
c203ccd7d838 qheader: exit withh meaningful error code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 2992
diff changeset
  1773
            return 1
2747
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  1774
        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
  1775
    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
  1776
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  1777
    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
  1778
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1779
def lastsavename(path):
2789
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2787
diff changeset
  1780
    (directory, base) = os.path.split(path)
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2787
diff changeset
  1781
    names = os.listdir(directory)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1782
    namere = re.compile("%s.([0-9]+)" % base)
2789
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2787
diff changeset
  1783
    maxindex = None
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1784
    maxname = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1785
    for f in names:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1786
        m = namere.match(f)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1787
        if m:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1788
            index = int(m.group(1))
2789
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2787
diff changeset
  1789
            if maxindex == None or index > maxindex:
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2787
diff changeset
  1790
                maxindex = index
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1791
                maxname = f
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1792
    if maxname:
2789
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2787
diff changeset
  1793
        return (os.path.join(directory, maxname), maxindex)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1794
    return (None, None)
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1795
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1796
def savename(path):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1797
    (last, index) = lastsavename(path)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1798
    if last is None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1799
        index = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1800
    newpath = path + ".%d" % (index + 1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1801
    return newpath
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1802
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1803
def push(ui, repo, patch=None, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1804
    """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
  1805
    q = repo.mq
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1806
    mergeq = None
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1807
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1808
    if opts['all']:
3604
437489d8dfbf mq: handle qpush -a with empty series
Brendan Cully <brendan@kublai.com>
parents: 3578
diff changeset
  1809
        if not q.series:
4100
c30c922f907a Modify qpush/qpop idempotent operations to return success
Ben Thomas <bthomas@virtualiron.com>
parents: 4099
diff changeset
  1810
            ui.warn(_('no patches in series\n'))
c30c922f907a Modify qpush/qpop idempotent operations to return success
Ben Thomas <bthomas@virtualiron.com>
parents: 4099
diff changeset
  1811
            return 0
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1812
        patch = q.series[-1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1813
    if opts['merge']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1814
        if opts['name']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1815
            newpath = opts['name']
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1816
        else:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1817
            newpath, i = lastsavename(q.path)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1818
        if not newpath:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1819
            ui.warn("no saved queues found, please use -n\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1820
            return 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1821
        mergeq = queue(ui, repo.join(""), newpath)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1822
        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
  1823
    ret = q.push(repo, patch, force=opts['force'], list=opts['list'],
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1824
                 mergeq=mergeq)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1825
    return ret
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1826
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1827
def pop(ui, repo, patch=None, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1828
    """pop the current patch off the stack"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1829
    localupdate = True
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1830
    if opts['name']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1831
        q = queue(ui, repo.join(""), repo.join(opts['name']))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1832
        ui.warn('using patch queue: %s\n' % q.path)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1833
        localupdate = False
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1834
    else:
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  1835
        q = repo.mq
4099
cf5580c16b13 mq: propagate the return error of pop
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4096
diff changeset
  1836
    ret = q.pop(repo, patch, force=opts['force'], update=localupdate,
cf5580c16b13 mq: propagate the return error of pop
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4096
diff changeset
  1837
                all=opts['all'])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1838
    q.save_dirty()
4099
cf5580c16b13 mq: propagate the return error of pop
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4096
diff changeset
  1839
    return ret
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1840
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1841
def rename(ui, repo, patch, name=None, **opts):
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1842
    """rename a patch
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1843
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1844
    With one argument, renames the current patch to PATCH1.
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1845
    With two arguments, renames PATCH1 to PATCH2."""
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1846
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1847
    q = repo.mq
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1848
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1849
    if not name:
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1850
        name = patch
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1851
        patch = None
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1852
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1853
    if patch:
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1854
        patch = q.lookup(patch)
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1855
    else:
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1856
        if not q.applied:
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1857
            ui.write(_('No patches applied\n'))
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1858
            return
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1859
        patch = q.lookup('qtip')
3080
82c9d1aac308 Make qrename handle directory targets; closes #333.
Brendan Cully <brendan@kublai.com>
parents: 3079
diff changeset
  1860
    absdest = q.join(name)
82c9d1aac308 Make qrename handle directory targets; closes #333.
Brendan Cully <brendan@kublai.com>
parents: 3079
diff changeset
  1861
    if os.path.isdir(absdest):
4037
bbdba01cce28 Enforce unixish style for all generated patch names.
Patrick Mezard <pmezard@gmail.com>
parents: 4016
diff changeset
  1862
        name = normname(os.path.join(name, os.path.basename(patch)))
3080
82c9d1aac308 Make qrename handle directory targets; closes #333.
Brendan Cully <brendan@kublai.com>
parents: 3079
diff changeset
  1863
        absdest = q.join(name)
82c9d1aac308 Make qrename handle directory targets; closes #333.
Brendan Cully <brendan@kublai.com>
parents: 3079
diff changeset
  1864
    if os.path.exists(absdest):
82c9d1aac308 Make qrename handle directory targets; closes #333.
Brendan Cully <brendan@kublai.com>
parents: 3079
diff changeset
  1865
        raise util.Abort(_('%s already exists') % absdest)
3215
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3179
diff changeset
  1866
3080
82c9d1aac308 Make qrename handle directory targets; closes #333.
Brendan Cully <brendan@kublai.com>
parents: 3079
diff changeset
  1867
    if name in q.series:
82c9d1aac308 Make qrename handle directory targets; closes #333.
Brendan Cully <brendan@kublai.com>
parents: 3079
diff changeset
  1868
        raise util.Abort(_('A patch named %s already exists in the series file') % name)
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1869
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1870
    if ui.verbose:
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1871
        ui.write('Renaming %s to %s\n' % (patch, name))
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1872
    i = q.find_series(patch)
3685
193e9c6d1a6d Issue424: mq patch loses guard when qrenamed
Mathieu Clabaut <mathieu.clabaut@gmail.com>
parents: 3681
diff changeset
  1873
    guards = q.guard_re.findall(q.full_series[i])
193e9c6d1a6d Issue424: mq patch loses guard when qrenamed
Mathieu Clabaut <mathieu.clabaut@gmail.com>
parents: 3681
diff changeset
  1874
    q.full_series[i] = name + ''.join([' #' + g for g in guards])
2767
60683ab1ed33 mq: rename read_series as parse_series, make simpler and faster
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2766
diff changeset
  1875
    q.parse_series()
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1876
    q.series_dirty = 1
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1877
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1878
    info = q.isapplied(patch)
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1879
    if info:
2807
bdc067ff6cf5 Make mq camelcase consistent with the rest of hg.
Brendan Cully <brendan@kublai.com>
parents: 2805
diff changeset
  1880
        q.applied[info[0]] = statusentry(info[1], name)
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1881
    q.applied_dirty = 1
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1882
2808
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2807
diff changeset
  1883
    util.rename(q.join(patch), absdest)
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1884
    r = q.qrepo()
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1885
    if r:
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1886
        wlock = r.wlock()
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1887
        try:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1888
            if r.dirstate[name] == 'r':
4961
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
  1889
                r.undelete([name])
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
  1890
            r.copy(patch, name)
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4959
diff changeset
  1891
            r.remove([patch], False)
4959
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1892
        finally:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4950
diff changeset
  1893
            del wlock
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1894
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1895
    q.save_dirty()
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  1896
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1897
def restore(ui, repo, rev, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1898
    """restore the queue state saved by a rev"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1899
    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
  1900
    q = repo.mq
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1901
    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
  1902
              qupdate=opts['update'])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1903
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1904
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1905
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1906
def save(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1907
    """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
  1908
    q = repo.mq
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4476
diff changeset
  1909
    message = cmdutil.logmessage(opts)
2694
0fb28dbf0dc7 MQ: uniformise message and logfile option.
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2682
diff changeset
  1910
    ret = q.save(repo, msg=message)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1911
    if ret:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1912
        return ret
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1913
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1914
    if opts['copy']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1915
        path = q.path
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1916
        if opts['name']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1917
            newpath = os.path.join(q.basepath, opts['name'])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1918
            if os.path.exists(newpath):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1919
                if not os.path.isdir(newpath):
2711
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2710
diff changeset
  1920
                    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: 2710
diff changeset
  1921
                                       'a directory') % newpath)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1922
                if not opts['force']:
2711
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2710
diff changeset
  1923
                    raise util.Abort(_('destination %s exists, '
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2710
diff changeset
  1924
                                       'use -f to force') % newpath)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1925
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1926
            newpath = savename(path)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1927
        ui.warn("copy %s to %s\n" % (path, newpath))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1928
        util.copyfiles(path, newpath)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1929
    if opts['empty']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1930
        try:
2808
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2807
diff changeset
  1931
            os.unlink(q.join(q.status_path))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1932
        except:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1933
            pass
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1934
    return 0
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1935
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1936
def strip(ui, repo, rev, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1937
    """strip a revision and all later revs on the same branch"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1938
    rev = repo.lookup(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1939
    backup = 'all'
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1940
    if opts['backup']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1941
        backup = 'strip'
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1942
    elif opts['nobackup']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1943
        backup = 'none'
3084
fd1479e30aaf mq: do not update an empty working directory after strip.
Brendan Cully <brendan@kublai.com>
parents: 3083
diff changeset
  1944
    update = repo.dirstate.parents()[0] != revlog.nullid
fd1479e30aaf mq: do not update an empty working directory after strip.
Brendan Cully <brendan@kublai.com>
parents: 3083
diff changeset
  1945
    repo.mq.strip(repo, rev, backup=backup, update=update)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1946
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1947
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1948
def select(ui, repo, *args, **opts):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1949
    '''set or print guarded patches to push
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1950
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1951
    Use the qguard command to set or print guards on patch, then use
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1952
    qselect to tell mq which guards to use. A patch will be pushed if it
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1953
    has no guards or any positive guards match the currently selected guard,
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1954
    but will not be pushed if any negative guards match the current guard.
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1955
    For example:
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1956
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1957
        qguard foo.patch -stable    (negative guard)
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1958
        qguard bar.patch +stable    (positive guard)
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1959
        qselect stable
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1960
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1961
    This activates the "stable" guard. mq will skip foo.patch (because
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1962
    it has a negative match) but push bar.patch (because it
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1963
    has a positive match).
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1964
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1965
    With no arguments, prints the currently active guards.
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1966
    With one argument, sets the active guard.
3215
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3179
diff changeset
  1967
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1968
    Use -n/--none to deactivate guards (no other arguments needed).
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1969
    When no guards are active, patches with positive guards are skipped
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1970
    and patches with negative guards are pushed.
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1971
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1972
    qselect can change the guards on applied patches. It does not pop
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1973
    guarded patches by default. Use --pop to pop back to the last applied
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1974
    patch that is not guarded. Use --reapply (which implies --pop) to push
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1975
    back to the current patch afterwards, but skip guarded patches.
2832
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1976
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1977
    Use -s/--series to print a list of all guards in the series file (no
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  1978
    other arguments needed). Use -v for more information.'''
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1979
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1980
    q = repo.mq
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1981
    guards = q.active()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1982
    if args or opts['none']:
2832
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1983
        old_unapplied = q.unapplied(repo)
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1984
        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
  1985
                       not q.pushable(i)[0]]
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1986
        q.set_active(args)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1987
        q.save_dirty()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1988
        if not args:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  1989
            ui.status(_('guards deactivated\n'))
2832
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1990
        if not opts['pop'] and not opts['reapply']:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1991
            unapplied = q.unapplied(repo)
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1992
            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
  1993
                       if not q.pushable(i)[0]]
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1994
            if len(unapplied) != len(old_unapplied):
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1995
                ui.status(_('number of unguarded, unapplied patches has '
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1996
                            'changed from %d to %d\n') %
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1997
                          (len(old_unapplied), len(unapplied)))
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1998
            if len(guarded) != len(old_guarded):
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  1999
                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
  2000
                            'from %d to %d\n') %
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2001
                          (len(old_guarded), len(guarded)))
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  2002
    elif opts['series']:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  2003
        guards = {}
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  2004
        noguards = 0
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  2005
        for gs in q.series_guards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  2006
            if not gs:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  2007
                noguards += 1
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  2008
            for g in gs:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  2009
                guards.setdefault(g, 0)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  2010
                guards[g] += 1
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  2011
        if ui.verbose:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  2012
            guards['NONE'] = noguards
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  2013
        guards = guards.items()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  2014
        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: 2808
diff changeset
  2015
        if guards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  2016
            ui.note(_('guards in series file:\n'))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  2017
            for guard, count in guards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  2018
                ui.note('%2d  ' % count)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  2019
                ui.write(guard, '\n')
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  2020
        else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  2021
            ui.note(_('no guards in series file\n'))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  2022
    else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  2023
        if guards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  2024
            ui.note(_('active guards:\n'))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  2025
            for g in guards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  2026
                ui.write(g, '\n')
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  2027
        else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  2028
            ui.write(_('no active guards\n'))
2832
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2029
    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
  2030
    popped = False
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2031
    if opts['pop'] or opts['reapply']:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2032
        for i in xrange(len(q.applied)):
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2033
            pushable, reason = q.pushable(i)
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2034
            if not pushable:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2035
                ui.status(_('popping guarded patches\n'))
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2036
                popped = True
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2037
                if i == 0:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2038
                    q.pop(repo, all=True)
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2039
                else:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2040
                    q.pop(repo, i-1)
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2041
                break
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2042
    if popped:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2043
        try:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2044
            if reapply:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2045
                ui.status(_('reapplying unguarded patches\n'))
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2046
                q.push(repo, reapply)
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2047
        finally:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2048
            q.save_dirty()
2810
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2808
diff changeset
  2049
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2050
def reposetup(ui, repo):
2807
bdc067ff6cf5 Make mq camelcase consistent with the rest of hg.
Brendan Cully <brendan@kublai.com>
parents: 2805
diff changeset
  2051
    class mqrepo(repo.__class__):
2836
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2833
diff changeset
  2052
        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: 2833
diff changeset
  2053
            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: 2833
diff changeset
  2054
                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: 2833
diff changeset
  2055
                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: 2833
diff changeset
  2056
                    raise util.Abort(errmsg)
3215
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3179
diff changeset
  2057
2833
addd03c7fbfa Disallow commit over an applied mq patch.
Brendan Cully <brendan@kublai.com>
parents: 2832
diff changeset
  2058
        def commit(self, *args, **opts):
addd03c7fbfa Disallow commit over an applied mq patch.
Brendan Cully <brendan@kublai.com>
parents: 2832
diff changeset
  2059
            if len(args) >= 6:
addd03c7fbfa Disallow commit over an applied mq patch.
Brendan Cully <brendan@kublai.com>
parents: 2832
diff changeset
  2060
                force = args[5]
addd03c7fbfa Disallow commit over an applied mq patch.
Brendan Cully <brendan@kublai.com>
parents: 2832
diff changeset
  2061
            else:
addd03c7fbfa Disallow commit over an applied mq patch.
Brendan Cully <brendan@kublai.com>
parents: 2832
diff changeset
  2062
                force = opts.get('force')
2836
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2833
diff changeset
  2063
            self.abort_if_wdir_patched(
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2833
diff changeset
  2064
                _('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: 2833
diff changeset
  2065
                force)
2833
addd03c7fbfa Disallow commit over an applied mq patch.
Brendan Cully <brendan@kublai.com>
parents: 2832
diff changeset
  2066
addd03c7fbfa Disallow commit over an applied mq patch.
Brendan Cully <brendan@kublai.com>
parents: 2832
diff changeset
  2067
            return super(mqrepo, self).commit(*args, **opts)
addd03c7fbfa Disallow commit over an applied mq patch.
Brendan Cully <brendan@kublai.com>
parents: 2832
diff changeset
  2068
2836
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2833
diff changeset
  2069
        def push(self, remote, force=False, revs=None):
4039
55578a8d7e84 mq: allow push if -r is given explicitly
Brendan Cully <brendan@kublai.com>
parents: 4037
diff changeset
  2070
            if self.mq.applied and not force and not revs:
2836
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2833
diff changeset
  2071
                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: 2833
diff changeset
  2072
            return super(mqrepo, self).push(remote, force, revs)
3215
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3179
diff changeset
  2073
2723
04d9b31faeca mq: do not hold a reference to repo in tags override
Brendan Cully <brendan@kublai.com>
parents: 2720
diff changeset
  2074
        def tags(self):
04d9b31faeca mq: do not hold a reference to repo in tags override
Brendan Cully <brendan@kublai.com>
parents: 2720
diff changeset
  2075
            if self.tagscache:
04d9b31faeca mq: do not hold a reference to repo in tags override
Brendan Cully <brendan@kublai.com>
parents: 2720
diff changeset
  2076
                return self.tagscache
04d9b31faeca mq: do not hold a reference to repo in tags override
Brendan Cully <brendan@kublai.com>
parents: 2720
diff changeset
  2077
2807
bdc067ff6cf5 Make mq camelcase consistent with the rest of hg.
Brendan Cully <brendan@kublai.com>
parents: 2805
diff changeset
  2078
            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
  2079
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  2080
            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
  2081
            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
  2082
                return tagscache
2663
96950d39171d Mq: modify repo.lookup to resolve applied patches too.
Brendan Cully <brendan@kublai.com>
parents: 2554
diff changeset
  2083
4210
6cb5be6bd70f mq: add qparent tag (first parent of qbase)
Brendan Cully <brendan@kublai.com>
parents: 4209
diff changeset
  2084
            mqtags = [(revlog.bin(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
  2085
            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
  2086
            mqtags.append((mqtags[0][0], 'qbase'))
4210
6cb5be6bd70f mq: add qparent tag (first parent of qbase)
Brendan Cully <brendan@kublai.com>
parents: 4209
diff changeset
  2087
            mqtags.append((self.changelog.parents(mqtags[0][0])[0], 'qparent'))
2723
04d9b31faeca mq: do not hold a reference to repo in tags override
Brendan Cully <brendan@kublai.com>
parents: 2720
diff changeset
  2088
            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
  2089
                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
  2090
                    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
  2091
                else:
4210
6cb5be6bd70f mq: add qparent tag (first parent of qbase)
Brendan Cully <brendan@kublai.com>
parents: 4209
diff changeset
  2092
                    tagscache[patch[1]] = patch[0]
2682
4e2dc5c16e61 Add mq patch names to tagscache instead of overriding lookup.
Brendan Cully <brendan@kublai.com>
parents: 2677
diff changeset
  2093
4e2dc5c16e61 Add mq patch names to tagscache instead of overriding lookup.
Brendan Cully <brendan@kublai.com>
parents: 2677
diff changeset
  2094
            return tagscache
2664
9b8df8dceeed Add qtip and qbase to mq qlookup.
Brendan Cully <brendan@kublai.com>
parents: 2663
diff changeset
  2095
3823
b3b868113d24 fix encoding conversion of branch names when mq is loaded
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3763
diff changeset
  2096
        def _branchtags(self):
3486
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3468
diff changeset
  2097
            q = self.mq
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3468
diff changeset
  2098
            if not q.applied:
3823
b3b868113d24 fix encoding conversion of branch names when mq is loaded
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3763
diff changeset
  2099
                return super(mqrepo, self)._branchtags()
3486
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3468
diff changeset
  2100
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3468
diff changeset
  2101
            self.branchcache = {} # avoid recursion in changectx
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3468
diff changeset
  2102
            cl = self.changelog
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3468
diff changeset
  2103
            partial, last, lrev = self._readbranchcache()
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3468
diff changeset
  2104
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3468
diff changeset
  2105
            qbase = cl.rev(revlog.bin(q.applied[0].rev))
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3468
diff changeset
  2106
            start = lrev + 1
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3468
diff changeset
  2107
            if start < qbase:
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3468
diff changeset
  2108
                # update the cache (excluding the patches) and save it
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3468
diff changeset
  2109
                self._updatebranchcache(partial, lrev+1, qbase)
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3468
diff changeset
  2110
                self._writebranchcache(partial, cl.node(qbase-1), qbase-1)
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3468
diff changeset
  2111
                start = qbase
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3468
diff changeset
  2112
            # if start = qbase, the cache is as updated as it should be.
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3468
diff changeset
  2113
            # if start > qbase, the cache includes (part of) the patches.
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3468
diff changeset
  2114
            # we might as well use it, but we won't save it.
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3468
diff changeset
  2115
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3468
diff changeset
  2116
            # update the cache up to the tip
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3468
diff changeset
  2117
            self._updatebranchcache(partial, start, cl.count())
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3468
diff changeset
  2118
3823
b3b868113d24 fix encoding conversion of branch names when mq is loaded
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3763
diff changeset
  2119
            return partial
3486
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3468
diff changeset
  2120
2839
82f50658c72b mq: only add mq attribute to local repo
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2838
diff changeset
  2121
    if repo.local():
82f50658c72b mq: only add mq attribute to local repo
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2838
diff changeset
  2122
        repo.__class__ = mqrepo
82f50658c72b mq: only add mq attribute to local repo
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2838
diff changeset
  2123
        repo.mq = queue(ui, repo.join(""))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2124
3176
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  2125
seriesopts = [('s', 'summary', None, _('print first line of patch header'))]
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  2126
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2127
cmdtable = {
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2128
    "qapplied": (applied, [] + seriesopts, _('hg qapplied [-s] [PATCH]')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2129
    "qclone":
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2130
        (clone,
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2131
         [('', 'pull', None, _('use pull protocol to copy metadata')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2132
          ('U', 'noupdate', None, _('do not update the new working directories')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2133
          ('', 'uncompressed', None,
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2134
           _('use uncompressed transfer (fast over LAN)')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2135
          ('p', 'patches', '', _('location of source patch repo')),
5122
c80af96943aa refactor options from cmdtable
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 5053
diff changeset
  2136
         ] + commands.remoteopts,
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2137
         _('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
  2138
    "qcommit|qci":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2139
        (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
  2140
         commands.table["^commit|ci"][1],
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2141
         _('hg qcommit [OPTION]... [FILE]...')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2142
    "^qdiff":
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2143
        (diff,
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2144
         [('g', 'git', None, _('use git extended diff format')),
5122
c80af96943aa refactor options from cmdtable
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 5053
diff changeset
  2145
         ] + commands.walkopts,
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2146
         _('hg qdiff [-I] [-X] [-g] [FILE]...')),
2889
57b88b86a845 Replace qdel/qfold -f option with -k/--keep.
Brendan Cully <brendan@kublai.com>
parents: 2882
diff changeset
  2147
    "qdelete|qremove|qrm":
2752
5dfeda163bb7 Add -f option to qdelete, to remove patch file.
Brendan Cully <brendan@kublai.com>
parents: 2751
diff changeset
  2148
        (delete,
3371
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
  2149
         [('k', 'keep', None, _('keep patch file')),
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
  2150
          ('r', 'rev', [], _('stop managing a revision'))],
4737
2ececafa5859 mq: more qdelete help text tweaks
Brendan Cully <brendan@kublai.com>
parents: 4736
diff changeset
  2151
         _('hg qdelete [-k] [-r REV]... [PATCH]...')),
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2152
    'qfold':
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2153
        (fold,
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2154
         [('e', 'edit', None, _('edit patch header')),
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2155
          ('k', 'keep', None, _('keep folded patch files')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2156
         ] + commands.commitopts,
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2157
         _('hg qfold [-e] [-k] [-m TEXT] [-l FILE] PATCH...')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2158
    'qgoto':
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2159
        (goto,
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2160
         [('f', 'force', None, _('overwrite any local changes'))],
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2161
         _('hg qgoto [OPTION]... PATCH')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2162
    'qguard':
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2163
        (guard,
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2164
         [('l', 'list', None, _('list all patches and guards')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2165
          ('n', 'none', None, _('drop all guards'))],
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2166
         _('hg qguard [-l] [-n] [PATCH] [+GUARD]... [-GUARD]...')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2167
    'qheader': (header, [], _('hg qheader [PATCH]')),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2168
    "^qimport":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2169
        (qimport,
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2170
         [('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
  2171
          ('n', 'name', '', 'patch file name'),
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3128
diff changeset
  2172
          ('f', 'force', None, 'overwrite existing files'),
3691
79151c94c3b4 mq: add --git option to qimport -r
Brendan Cully <brendan@kublai.com>
parents: 3685
diff changeset
  2173
          ('r', 'rev', [], 'place existing revisions under mq control'),
79151c94c3b4 mq: add --git option to qimport -r
Brendan Cully <brendan@kublai.com>
parents: 3685
diff changeset
  2174
          ('g', 'git', None, _('use git extended diff format'))],
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2175
         _('hg qimport [-e] [-n NAME] [-f] [-g] [-r REV]... FILE...')),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2176
    "^qinit":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2177
        (init,
2526
37785f986260 mq: Added help for qcommit, consistently talk about queue repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2488
diff changeset
  2178
         [('c', 'create-repo', None, 'create queue repository')],
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2179
         _('hg qinit [-c]')),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2180
    "qnew":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2181
        (new,
2939
abd0be815c9c Add qnew -e option.
Brendan Cully <brendan@kublai.com>
parents: 2938
diff changeset
  2182
         [('e', 'edit', None, _('edit commit message')),
4713
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
  2183
          ('f', 'force', None, _('import uncommitted changes into patch')),
5025
7041869a1bf6 mq: add qnew --git option
Patrick Mezard <pmezard@gmail.com>
parents: 4970
diff changeset
  2184
          ('g', 'git', None, _('use git extended diff format')),
5122
c80af96943aa refactor options from cmdtable
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 5053
diff changeset
  2185
          ] + commands.walkopts + commands.commitopts,
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2186
         _('hg qnew [-e] [-m TEXT] [-l FILE] [-f] PATCH [FILE]...')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2187
    "qnext": (next, [] + seriesopts, _('hg qnext [-s]')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2188
    "qprev": (prev, [] + seriesopts, _('hg qprev [-s]')),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2189
    "^qpop":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2190
        (pop,
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2191
         [('a', 'all', None, _('pop all patches')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2192
          ('n', 'name', '', _('queue name to pop')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2193
          ('f', 'force', None, _('forget any local changes'))],
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2194
         _('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
  2195
    "^qpush":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2196
        (push,
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2197
         [('f', 'force', None, _('apply if the patch has rejects')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2198
          ('l', 'list', None, _('list patch name in commit text')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2199
          ('a', 'all', None, _('apply all patches')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2200
          ('m', 'merge', None, _('merge from another queue')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2201
          ('n', 'name', '', _('merge queue name'))],
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2202
         _('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
  2203
    "^qrefresh":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2204
        (refresh,
2746
0503eb5c0a33 Add option -e/--edit to qrefresh, to edit the existing header.
Brendan Cully <brendan@kublai.com>
parents: 2745
diff changeset
  2205
         [('e', 'edit', None, _('edit commit message')),
3083
17747e80ea6c mq: Add --git option to qrefresh
Brendan Cully <brendan@kublai.com>
parents: 3082
diff changeset
  2206
          ('g', 'git', None, _('use git extended diff format')),
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2207
          ('s', 'short', None, _('refresh only files already in the patch')),
5122
c80af96943aa refactor options from cmdtable
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 5053
diff changeset
  2208
          ] + commands.walkopts + commands.commitopts,
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2209
         _('hg qrefresh [-I] [-X] [-e] [-m TEXT] [-l FILE] [-s] [FILE]...')),
2751
7d1de4545728 mq: add qmv as alias for qrename
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2750
diff changeset
  2210
    'qrename|qmv':
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2211
        (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
  2212
    "qrestore":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2213
        (restore,
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2214
         [('d', 'delete', None, _('delete save entry')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2215
          ('u', 'update', None, _('update queue working dir'))],
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2216
         _('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
  2217
    "qsave":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2218
        (save,
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2219
         [('c', 'copy', None, _('copy patch directory')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2220
          ('n', 'name', '', _('copy directory name')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2221
          ('e', 'empty', None, _('clear queue status file')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2222
          ('f', 'force', None, _('force copy'))] + commands.commitopts,
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2223
         _('hg qsave [-m TEXT] [-l FILE] [-c] [-n NAME] [-e] [-f]')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2224
    "qselect":
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2225
        (select,
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2226
         [('n', 'none', None, _('disable all guards')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2227
          ('s', 'series', None, _('list all guards in series file')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2228
          ('', 'pop', None, _('pop to before first guarded applied patch')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2229
          ('', 'reapply', None, _('pop, then reapply patches'))],
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2230
         _('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
  2231
    "qseries":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2232
        (series,
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2233
         [('m', 'missing', None, _('print patches not in series')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2234
         ] + seriesopts,
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2235
         _('hg qseries [-ms]')),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2236
    "^strip":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2237
        (strip,
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2238
         [('f', 'force', None, _('force multi-head removal')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2239
          ('b', 'backup', None, _('bundle unrelated changesets')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2240
          ('n', 'nobackup', None, _('no backups'))],
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2241
         _('hg strip [-f] [-b] [-n] REV')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2242
    "qtop": (top, [] + seriesopts, _('hg qtop [-s]')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2243
    "qunapplied": (unapplied, [] + seriesopts, _('hg qunapplied [-s] [PATCH]')),
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2244
}