hgext/mq.py
author Thomas Arendsen Hein <thomas@intevation.de>
Wed, 08 Mar 2006 19:31:54 +0100
changeset 1863 e8b86fb8ae33
parent 1852 fdf9cbf56ec7
child 2047 ebf1ecb5f4e8
permissions -rw-r--r--
Removed script header from mq.py
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
#
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
     3
# Copyright 2005 Chris Mason <mason@suse.com>
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
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
     8
from mercurial.demandload import *
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
     9
demandload(globals(), "os sys re struct traceback errno bz2")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    10
from mercurial.i18n import gettext as _
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    11
from mercurial import ui, hg, revlog, commands, util
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    12
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    13
versionstr = "0.45"
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    14
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    15
repomap = {}
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    16
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    17
class queue:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    18
    def __init__(self, ui, path, patchdir=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    19
        self.basepath = path
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    20
        if patchdir:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    21
            self.path = patchdir
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    22
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    23
            self.path = 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
    24
        self.opener = util.opener(self.path)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    25
        self.ui = ui
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    26
        self.applied = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    27
        self.full_series = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    28
        self.applied_dirty = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    29
        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
    30
        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
    31
        self.status_path = "status"
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
    32
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
    33
        if os.path.exists(os.path.join(self.path, self.series_path)):
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
    34
            self.full_series = self.opener(self.series_path).read().splitlines()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    35
        self.read_series(self.full_series)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    36
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
    37
        if os.path.exists(os.path.join(self.path, self.status_path)):
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
    38
            self.applied = self.opener(self.status_path).read().splitlines()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    39
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    40
    def find_series(self, patch):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    41
        pre = re.compile("(\s*)([^#]+)")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    42
        index = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    43
        for l in self.full_series:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    44
            m = pre.match(l)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    45
            if m:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    46
                s = m.group(2)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    47
                s = s.rstrip()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    48
                if s == patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    49
                    return index
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    50
            index += 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    51
        return None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    52
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    53
    def read_series(self, list):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    54
        def matcher(list):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    55
            pre = re.compile("(\s*)([^#]+)")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    56
            for l in list:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    57
                m = pre.match(l)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    58
                if m:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    59
                    s = m.group(2)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    60
                    s = s.rstrip()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    61
                    if len(s) > 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    62
                        yield s
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    63
        self.series = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    64
        self.series = [ x for x in matcher(list) ]
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
    65
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    66
    def save_dirty(self):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    67
        if self.applied_dirty:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    68
            if len(self.applied) > 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    69
                nl = "\n"
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    70
            else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    71
                nl = ""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    72
            f = self.opener(self.status_path, "w")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    73
            f.write("\n".join(self.applied) + nl)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    74
        if self.series_dirty:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    75
            if len(self.full_series) > 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    76
                nl = "\n"
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    77
            else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    78
                nl = ""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    79
            f = self.opener(self.series_path, "w")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    80
            f.write("\n".join(self.full_series) + nl)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    81
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    82
    def readheaders(self, patch):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    83
        def eatdiff(lines):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    84
            while lines:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    85
                l = lines[-1]
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
    86
                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
    87
                    l.startswith("Index:") or
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
    88
                    l.startswith("===========")):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    89
                    del lines[-1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    90
                else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    91
                    break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    92
        def eatempty(lines):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    93
            while lines:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    94
                l = lines[-1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    95
                if re.match('\s*$', l):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    96
                    del lines[-1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    97
                else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    98
                    break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    99
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   100
        pf = os.path.join(self.path, patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   101
        message = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   102
        comments = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   103
        user = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   104
        format = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   105
        subject = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   106
        diffstart = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   107
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   108
        for line in file(pf):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   109
            line = line.rstrip()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   110
            if diffstart:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   111
                if line.startswith('+++ '):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   112
                    diffstart = 2
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   113
                break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   114
            if line.startswith("--- "):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   115
                diffstart = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   116
                continue
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   117
            elif format == "hgpatch":
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   118
                # parse values when importing the result of an hg export
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   119
                if line.startswith("# User "):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   120
                    user = line[7:]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   121
                elif not line.startswith("# ") and line:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   122
                    message.append(line)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   123
                    format = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   124
            elif line == '# HG changeset patch':
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   125
                format = "hgpatch"
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   126
            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
   127
                                           line.startswith("subject: "))):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   128
                subject = line[9:]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   129
                format = "tag"
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   130
            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
   131
                                           line.startswith("from: "))):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   132
                user = line[6:]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   133
                format = "tag"
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   134
            elif format == "tag" and line == "":
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   135
                # when looking for tags (subject: from: etc) they
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   136
                # end once you find a blank line in the source
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   137
                format = "tagdone"
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   138
            else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   139
                message.append(line)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   140
            comments.append(line)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   141
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   142
        eatdiff(message)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   143
        eatdiff(comments)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   144
        eatempty(message)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   145
        eatempty(comments)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   146
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   147
        # make sure message isn't empty
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   148
        if format and format.startswith("tag") and subject:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   149
            message.insert(0, "")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   150
            message.insert(0, subject)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   151
        return (message, comments, user, diffstart > 1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   152
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   153
    def mergeone(self, repo, mergeq, head, patch, rev, wlock):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   154
        # 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
   155
        (err, n) = self.apply(repo, [ patch ], update_status=False,
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   156
                              strict=True, merge=rev, wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   157
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   158
        if err == 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   159
            return (err, n)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   160
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   161
        if n is None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   162
            self.ui.warn("apply failed for patch %s\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   163
            sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   164
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   165
        self.ui.warn("patch didn't work out, merging %s\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   166
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   167
        # apply failed, strip away that rev and merge.
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   168
        repo.update(head, allow=False, force=True, wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   169
        self.strip(repo, n, update=False, backup='strip', wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   170
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   171
        c = repo.changelog.read(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   172
        ret = repo.update(rev, allow=True, wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   173
        if ret:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   174
            self.ui.warn("update returned %d\n" % ret)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   175
            sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   176
        n = repo.commit(None, c[4], c[1], force=1, wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   177
        if n == None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   178
            self.ui.warn("repo commit failed\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   179
            sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   180
        try:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   181
            message, comments, user, patchfound = mergeq.readheaders(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   182
        except:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   183
            self.ui.warn("Unable to read %s\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   184
            sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   185
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
   186
        patchf = self.opener(patch, "w")
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   187
        if comments:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   188
            comments = "\n".join(comments) + '\n\n'
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   189
            patchf.write(comments)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   190
        commands.dodiff(patchf, self.ui, repo, head, n)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   191
        patchf.close()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   192
        return (0, n)
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   193
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   194
    def qparents(self, repo, rev=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   195
        if rev is None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   196
            (p1, p2) = repo.dirstate.parents()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   197
            if p2 == revlog.nullid:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   198
                return p1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   199
            if len(self.applied) == 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   200
                return None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   201
            (top, patch) = self.applied[-1].split(':')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   202
            top = revlog.bin(top)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   203
            return top
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   204
        pp = repo.changelog.parents(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   205
        if pp[1] != revlog.nullid:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   206
            arevs = [ x.split(':')[0] for x in self.applied ]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   207
            p0 = revlog.hex(pp[0])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   208
            p1 = revlog.hex(pp[1])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   209
            if p0 in arevs:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   210
                return pp[0]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   211
            if p1 in arevs:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   212
                return pp[1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   213
            return None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   214
        return pp[0]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   215
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   216
    def mergepatch(self, repo, mergeq, series, wlock):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   217
        if len(self.applied) == 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   218
            # each of the patches merged in will have two parents.  This
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   219
            # can confuse the qrefresh, qdiff, and strip code because it
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   220
            # needs to know which parent is actually in the patch queue.
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   221
            # so, we insert a merge marker with only one parent.  This way
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   222
            # the first patch in the queue is never a merge patch
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   223
            #
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   224
            pname = ".hg.patches.merge.marker"
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   225
            n = repo.commit(None, '[mq]: merge marker', user=None, force=1,
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   226
                            wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   227
            self.applied.append(revlog.hex(n) + ":" + pname)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   228
            self.applied_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   229
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   230
        head = self.qparents(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   231
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   232
        for patch in series:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   233
            patch = mergeq.lookup(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   234
            if not patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   235
                self.ui.warn("patch %s does not exist\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   236
                return (1, None)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   237
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   238
            info = mergeq.isapplied(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   239
            if not info:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   240
                self.ui.warn("patch %s is not applied\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   241
                return (1, None)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   242
            rev = revlog.bin(info[1])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   243
            (err, head) = self.mergeone(repo, mergeq, head, patch, rev, wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   244
            if head:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   245
                self.applied.append(revlog.hex(head) + ":" + patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   246
                self.applied_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   247
            if err:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   248
                return (err, head)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   249
        return (0, head)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   250
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   251
    def apply(self, repo, series, list=False, update_status=True,
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   252
              strict=False, patchdir=None, merge=None, wlock=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   253
        # TODO unify with commands.py
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   254
        if not patchdir:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   255
            patchdir = self.path
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   256
        pwd = os.getcwd()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   257
        os.chdir(repo.root)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   258
        err = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   259
        if not wlock:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   260
            wlock = repo.wlock()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   261
        lock = repo.lock()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   262
        tr = repo.transaction()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   263
        n = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   264
        for patch in series:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   265
            self.ui.warn("applying %s\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   266
            pf = os.path.join(patchdir, patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   267
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   268
            try:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   269
                message, comments, user, patchfound = self.readheaders(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   270
            except:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   271
                self.ui.warn("Unable to read %s\n" % pf)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   272
                err = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   273
                break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   274
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   275
            if not message:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   276
                message = "imported patch %s\n" % patch
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   277
            else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   278
                if list:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   279
                    message.append("\nimported patch %s" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   280
                message = '\n'.join(message)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   281
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   282
            try:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   283
                f = os.popen("patch -p1 --no-backup-if-mismatch < '%s'" % (pf))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   284
            except:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   285
                self.ui.warn("patch failed, unable to continue (try -v)\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   286
                err = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   287
                break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   288
            files = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   289
            fuzz = False
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   290
            for l in f:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   291
                l = l.rstrip('\r\n');
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   292
                if self.ui.verbose:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   293
                    self.ui.warn(l + "\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   294
                if l[:14] == 'patching file ':
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   295
                    pf = os.path.normpath(l[14:])
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   296
                    # when patch finds a space in the file name, it puts
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   297
                    # single quotes around the filename.  strip them off
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   298
                    if pf[0] == "'" and pf[-1] == "'":
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   299
                        pf = pf[1:-1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   300
                    if pf not in files:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   301
                        files.append(pf)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   302
                    printed_file = False
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   303
                    file_str = l
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   304
                elif l.find('with fuzz') >= 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   305
                    if not printed_file:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   306
                        self.ui.warn(file_str + '\n')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   307
                        printed_file = True
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   308
                    self.ui.warn(l + '\n')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   309
                    fuzz = True
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   310
                elif l.find('saving rejects to file') >= 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   311
                    self.ui.warn(l + '\n')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   312
                elif l.find('FAILED') >= 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   313
                    if not printed_file:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   314
                        self.ui.warn(file_str + '\n')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   315
                        printed_file = True
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   316
                    self.ui.warn(l + '\n')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   317
            patcherr = f.close()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   318
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   319
            if merge and len(files) > 0:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   320
                # Mark as merged and update dirstate parent info
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   321
                repo.dirstate.update(repo.dirstate.filterfiles(files), 'm')
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   322
                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
   323
                repo.dirstate.setparents(p1, merge)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   324
            if len(files) > 0:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   325
                commands.addremove_lock(self.ui, repo, files,
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   326
                                        opts={}, wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   327
            n = repo.commit(files, message, user, force=1, lock=lock,
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   328
                            wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   329
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   330
            if n == None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   331
                self.ui.warn("repo commit failed\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   332
                sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   333
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   334
            if update_status:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   335
                self.applied.append(revlog.hex(n) + ":" + patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   336
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   337
            if patcherr:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   338
                if not patchfound:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   339
                    self.ui.warn("patch %s is empty\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   340
                    err = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   341
                else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   342
                    self.ui.warn("patch failed, rejects left in working dir\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   343
                    err = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   344
                break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   345
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   346
            if fuzz and strict:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   347
                self.ui.warn("fuzz found when applying patch, stopping\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   348
                err = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   349
                break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   350
        tr.close()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   351
        os.chdir(pwd)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   352
        return (err, n)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   353
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   354
    def delete(self, repo, patch):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   355
        patch = self.lookup(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   356
        info = self.isapplied(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   357
        if info:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   358
            self.ui.warn("cannot delete applied patch %s\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   359
            sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   360
        if patch not in self.series:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   361
            self.ui.warn("patch %s not in series file\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   362
            sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   363
        i = self.find_series(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   364
        del self.full_series[i]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   365
        self.read_series(self.full_series)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   366
        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
   367
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   368
    def check_toppatch(self, repo):
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
            (top, patch) = self.applied[-1].split(':')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   371
            top = revlog.bin(top)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   372
            pp = repo.dirstate.parents()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   373
            if top not in pp:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   374
                self.ui.warn("queue top not at dirstate parents. top %s dirstate %s %s\n" %( revlog.short(top), revlog.short(pp[0]), revlog.short(pp[1])))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   375
                sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   376
            return top
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   377
        return None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   378
    def check_localchanges(self, repo):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   379
        (c, a, r, d, u) = repo.changes(None, None)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   380
        if c or a or d or r:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   381
            self.ui.write("Local changes found, refresh first\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   382
            sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   383
    def new(self, repo, patch, msg=None, force=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   384
        if not force:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   385
            self.check_localchanges(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   386
        self.check_toppatch(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   387
        wlock = repo.wlock()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   388
        insert = self.series_end()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   389
        if msg:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   390
            n = repo.commit([], "[mq]: %s" % msg, force=True, wlock=wlock)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   391
        else:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   392
            n = repo.commit([],
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   393
                            "New patch: %s" % patch, force=True, wlock=wlock)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   394
        if n == None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   395
            self.ui.warn("repo commit failed\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   396
            sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   397
        self.full_series[insert:insert] = [patch]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   398
        self.applied.append(revlog.hex(n) + ":" + patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   399
        self.read_series(self.full_series)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   400
        self.series_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   401
        self.applied_dirty = 1
1852
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
   402
        p = self.opener(patch, "w")
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   403
        if msg:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   404
            msg = msg + "\n"
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   405
            p.write(msg)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   406
        p.close()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   407
        wlock = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   408
        r = self.qrepo()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   409
        if r: r.add([patch])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   410
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   411
    def strip(self, repo, rev, update=True, backup="all", wlock=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   412
        def limitheads(chlog, stop):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   413
            """return the list of all nodes that have no children"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   414
            p = {}
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   415
            h = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   416
            stoprev = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   417
            if stop in chlog.nodemap:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   418
                stoprev = chlog.rev(stop)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   419
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   420
            for r in range(chlog.count() - 1, -1, -1):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   421
                n = chlog.node(r)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   422
                if n not in p:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   423
                    h.append(n)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   424
                if n == stop:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   425
                    break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   426
                if r < stoprev:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   427
                    break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   428
                for pn in chlog.parents(n):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   429
                    p[pn] = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   430
            return h
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   431
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   432
        def bundle(cg):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   433
            backupdir = repo.join("strip-backup")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   434
            if not os.path.isdir(backupdir):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   435
                os.mkdir(backupdir)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   436
            name = os.path.join(backupdir, "%s" % revlog.short(rev))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   437
            name = savename(name)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   438
            self.ui.warn("saving bundle to %s\n" % name)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   439
            # TODO, exclusive open
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   440
            f = open(name, "wb")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   441
            try:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   442
                f.write("HG10")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   443
                z = bz2.BZ2Compressor(9)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   444
                while 1:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   445
                    chunk = cg.read(4096)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   446
                    if not chunk:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   447
                        break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   448
                    f.write(z.compress(chunk))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   449
                f.write(z.flush())
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   450
            except:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   451
                os.unlink(name)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   452
                raise
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   453
            f.close()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   454
            return name
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   455
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   456
        def stripall(rev, revnum):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   457
            cl = repo.changelog
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   458
            c = cl.read(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   459
            mm = repo.manifest.read(c[0])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   460
            seen = {}
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   461
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   462
            for x in xrange(revnum, cl.count()):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   463
                c = cl.read(cl.node(x))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   464
                for f in c[3]:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   465
                    if f in seen:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   466
                        continue
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   467
                    seen[f] = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   468
                    if f in mm:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   469
                        filerev = mm[f]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   470
                    else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   471
                        filerev = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   472
                    seen[f] = filerev
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   473
            # we go in two steps here so the strip loop happens in a
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   474
            # sensible order.  When stripping many files, this helps keep
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   475
            # our disk access patterns under control.
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   476
            list = seen.keys()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   477
            list.sort()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   478
            for f in list:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   479
                ff = repo.file(f)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   480
                filerev = seen[f]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   481
                if filerev != 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   482
                    if filerev in ff.nodemap:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   483
                        filerev = ff.rev(filerev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   484
                    else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   485
                        filerev = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   486
                ff.strip(filerev, revnum)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   487
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   488
        if not wlock:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   489
            wlock = repo.wlock()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   490
        lock = repo.lock()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   491
        chlog = repo.changelog
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   492
        # TODO delete the undo files, and handle undo of merge sets
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   493
        pp = chlog.parents(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   494
        revnum = chlog.rev(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   495
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   496
        if update:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   497
            urev = self.qparents(repo, rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   498
            repo.update(urev, allow=False, force=True, wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   499
            repo.dirstate.write()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   500
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   501
        # save is a list of all the branches we are truncating away
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   502
        # that we actually want to keep.  changegroup will be used
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   503
        # to preserve them and add them back after the truncate
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   504
        saveheads = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   505
        savebases = {}
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   506
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   507
        tip = chlog.tip()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   508
        heads = limitheads(chlog, rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   509
        seen = {}
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   510
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   511
        # search through all the heads, finding those where the revision
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   512
        # we want to strip away is an ancestor.  Also look for merges
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   513
        # that might be turned into new heads by the strip.
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   514
        while heads:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   515
            h = heads.pop()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   516
            n = h
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   517
            while True:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   518
                seen[n] = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   519
                pp = chlog.parents(n)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   520
                if pp[1] != revlog.nullid and chlog.rev(pp[1]) > revnum:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   521
                    if pp[1] not in seen:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   522
                        heads.append(pp[1])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   523
                if pp[0] == revlog.nullid:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   524
                    break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   525
                if chlog.rev(pp[0]) < revnum:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   526
                    break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   527
                n = pp[0]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   528
                if n == rev:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   529
                    break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   530
            r = chlog.reachable(h, rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   531
            if rev not in r:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   532
                saveheads.append(h)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   533
                for x in r:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   534
                    if chlog.rev(x) > revnum:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   535
                        savebases[x] = 1
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   536
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   537
        # create a changegroup for all the branches we need to keep
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   538
        if backup is "all":
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   539
            backupch = repo.changegroupsubset([rev], chlog.heads(), 'strip')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   540
            bundle(backupch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   541
        if saveheads:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   542
            backupch = repo.changegroupsubset(savebases.keys(), saveheads, 'strip')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   543
            chgrpfile = bundle(backupch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   544
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   545
        stripall(rev, revnum)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   546
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   547
        change = chlog.read(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   548
        repo.manifest.strip(repo.manifest.rev(change[0]), revnum)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   549
        chlog.strip(revnum, revnum)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   550
        if saveheads:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   551
            self.ui.status("adding branch\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   552
            commands.unbundle(self.ui, repo, chgrpfile, update=False)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   553
            if backup is not "strip":
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   554
                os.unlink(chgrpfile)
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   555
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   556
    def isapplied(self, patch):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   557
        """returns (index, rev, patch)"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   558
        for i in xrange(len(self.applied)):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   559
            p = self.applied[i]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   560
            a = p.split(':')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   561
            if a[1] == patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   562
                return (i, a[0], a[1])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   563
        return None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   564
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   565
    def lookup(self, patch):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   566
        if patch == None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   567
            return None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   568
        if patch in self.series:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   569
            return patch
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   570
        if not os.path.isfile(os.path.join(self.path, patch)):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   571
            try:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   572
                sno = int(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   573
            except(ValueError, OverflowError):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   574
                self.ui.warn("patch %s not in series\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   575
                sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   576
            if sno >= len(self.series):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   577
                self.ui.warn("patch number %d is out of range\n" % sno)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   578
                sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   579
            patch = self.series[sno]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   580
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   581
            self.ui.warn("patch %s not in series\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   582
            sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   583
        return patch
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   584
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   585
    def push(self, repo, patch=None, force=False, list=False,
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   586
             mergeq=None, wlock=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   587
        if not wlock:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   588
            wlock = repo.wlock()
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   589
        patch = self.lookup(patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   590
        if patch and self.isapplied(patch):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   591
            self.ui.warn("patch %s is already applied\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   592
            sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   593
        if self.series_end() == len(self.series):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   594
            self.ui.warn("File series fully applied\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   595
            sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   596
        if not force:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   597
            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
   598
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   599
        self.applied_dirty = 1;
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   600
        start = self.series_end()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   601
        if start > 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   602
            self.check_toppatch(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   603
        if not patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   604
            patch = self.series[start]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   605
            end = start + 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   606
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   607
            end = self.series.index(patch, start) + 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   608
        s = self.series[start:end]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   609
        if mergeq:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   610
            ret = self.mergepatch(repo, mergeq, s, wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   611
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   612
            ret = self.apply(repo, s, list, wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   613
        top = self.applied[-1].split(':')[1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   614
        if ret[0]:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   615
            self.ui.write("Errors during apply, please fix and refresh %s\n" %
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   616
                          top)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   617
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   618
            self.ui.write("Now at: %s\n" % top)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   619
        return ret[0]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   620
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   621
    def pop(self, repo, patch=None, force=False, update=True, wlock=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   622
        def getfile(f, rev):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   623
            t = repo.file(f).read(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   624
            try:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   625
                repo.wfile(f, "w").write(t)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   626
            except IOError:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   627
                os.makedirs(os.path.dirname(repo.wjoin(f)))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   628
                repo.wfile(f, "w").write(t)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   629
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   630
        if not wlock:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   631
            wlock = repo.wlock()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   632
        if patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   633
            # index, rev, patch
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   634
            info = self.isapplied(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   635
            if not info:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   636
                patch = self.lookup(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   637
            info = self.isapplied(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   638
            if not info:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   639
                self.ui.warn("patch %s is not applied\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   640
                sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   641
        if len(self.applied) == 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   642
            self.ui.warn("No patches applied\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   643
            sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   644
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   645
        if not update:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   646
            parents = repo.dirstate.parents()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   647
            rr = [ revlog.bin(x.split(':')[0]) for x in self.applied ]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   648
            for p in parents:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   649
                if p in rr:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   650
                    self.ui.warn("qpop: forcing dirstate update\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   651
                    update = True
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   652
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   653
        if not force and update:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   654
            self.check_localchanges(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   655
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   656
        self.applied_dirty = 1;
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   657
        end = len(self.applied)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   658
        if not patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   659
            info = [len(self.applied) - 1] + self.applied[-1].split(':')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   660
        start = info[0]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   661
        rev = revlog.bin(info[1])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   662
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   663
        # we know there are no local changes, so we can make a simplified
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   664
        # form of hg.update.
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   665
        if update:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   666
            top = self.check_toppatch(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   667
            qp = self.qparents(repo, rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   668
            changes = repo.changelog.read(qp)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   669
            mf1 = repo.manifest.readflags(changes[0])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   670
            mmap = repo.manifest.read(changes[0])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   671
            (c, a, r, d, u) = repo.changes(qp, top)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   672
            if d:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   673
                raise util.Abort("deletions found between repo revs")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   674
            for f in c:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   675
                getfile(f, mmap[f])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   676
            for f in r:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   677
                getfile(f, mmap[f])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   678
                util.set_exec(repo.wjoin(f), mf1[f])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   679
            repo.dirstate.update(c + r, 'n')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   680
            for f in a:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   681
                try: os.unlink(repo.wjoin(f))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   682
                except: raise
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   683
                try: os.removedirs(os.path.dirname(repo.wjoin(f)))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   684
                except: pass
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   685
            if a:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   686
                repo.dirstate.forget(a)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   687
            repo.dirstate.setparents(qp, revlog.nullid)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   688
        self.strip(repo, rev, update=False, backup='strip', wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   689
        del self.applied[start:end]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   690
        if len(self.applied):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   691
            self.ui.write("Now at: %s\n" % self.applied[-1].split(':')[1])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   692
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   693
            self.ui.write("Patch queue now empty\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   694
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   695
    def diff(self, repo, files):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   696
        top = self.check_toppatch(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   697
        if not top:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   698
            self.ui.write("No patches applied\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   699
            return
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   700
        qp = self.qparents(repo, top)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   701
        commands.dodiff(sys.stdout, self.ui, repo, qp, None, files)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   702
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   703
    def refresh(self, repo, short=False):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   704
        if len(self.applied) == 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   705
            self.ui.write("No patches applied\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   706
            return
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   707
        wlock = repo.wlock()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   708
        self.check_toppatch(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   709
        qp = self.qparents(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   710
        (top, patch) = self.applied[-1].split(':')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   711
        top = revlog.bin(top)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   712
        cparents = repo.changelog.parents(top)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   713
        patchparent = self.qparents(repo, top)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   714
        message, comments, user, patchfound = self.readheaders(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   715
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
   716
        patchf = self.opener(patch, "w")
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   717
        if comments:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   718
            comments = "\n".join(comments) + '\n\n'
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   719
            patchf.write(comments)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   720
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   721
        tip = repo.changelog.tip()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   722
        if top == tip:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   723
            # if the top of our patch queue is also the tip, there is an
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   724
            # optimization here.  We update the dirstate in place and strip
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   725
            # off the tip commit.  Then just commit the current directory
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   726
            # tree.  We can also send repo.commit the list of files
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   727
            # changed to speed up the diff
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   728
            #
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   729
            # in short mode, we only diff the files included in the
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   730
            # patch already
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   731
            #
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   732
            # this should really read:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   733
            #(cc, dd, aa, aa2, uu) = repo.changes(tip, patchparent)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   734
            # but we do it backwards to take advantage of manifest/chlog
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   735
            # caching against the next repo.changes call
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   736
            #
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   737
            (cc, aa, dd, aa2, uu) = repo.changes(patchparent, tip)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   738
            if short:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   739
                filelist = cc + aa + dd
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   740
            else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   741
                filelist = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   742
            (c, a, r, d, u) = repo.changes(None, None, filelist)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   743
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   744
            # we might end up with files that were added between tip and
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   745
            # the dirstate parent, but then changed in the local dirstate.
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   746
            # in this case, we want them to only show up in the added section
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   747
            for x in c:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   748
                if x not in aa:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   749
                    cc.append(x)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   750
            # we might end up with files added by the local dirstate that
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   751
            # were deleted by the patch.  In this case, they should only
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   752
            # show up in the changed section.
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   753
            for x in a:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   754
                if x in dd:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   755
                    del dd[dd.index(x)]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   756
                    cc.append(x)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   757
                else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   758
                    aa.append(x)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   759
            # make sure any files deleted in the local dirstate
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   760
            # are not in the add or change column of the patch
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   761
            forget = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   762
            for x in d + r:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   763
                if x in aa:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   764
                    del aa[aa.index(x)]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   765
                    forget.append(x)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   766
                    continue
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   767
                elif x in cc:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   768
                    del cc[cc.index(x)]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   769
                dd.append(x)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   770
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   771
            c = list(util.unique(cc))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   772
            r = list(util.unique(dd))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   773
            a = list(util.unique(aa))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   774
            filelist = list(util.unique(c + r + a ))
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   775
            commands.dodiff(patchf, self.ui, repo, patchparent, None,
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   776
                            filelist, changes=(c, a, r, [], u))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   777
            patchf.close()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   778
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   779
            changes = repo.changelog.read(tip)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   780
            repo.dirstate.setparents(*cparents)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   781
            repo.dirstate.update(a, 'a')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   782
            repo.dirstate.update(r, 'r')
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   783
            repo.dirstate.update(c, 'n')
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   784
            repo.dirstate.forget(forget)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   785
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   786
            if not message:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   787
                message = "patch queue: %s\n" % patch
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   788
            else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   789
                message = "\n".join(message)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   790
            self.strip(repo, top, update=False, backup='strip', wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   791
            n = repo.commit(filelist, message, changes[1], force=1, wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   792
            self.applied[-1] = revlog.hex(n) + ':' + patch
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   793
            self.applied_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   794
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   795
            commands.dodiff(patchf, self.ui, repo, patchparent, None)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   796
            patchf.close()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   797
            self.pop(repo, force=True, wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   798
            self.push(repo, force=True, wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   799
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   800
    def init(self, repo, create=False):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   801
        if os.path.isdir(self.path):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   802
            raise util.Abort("patch queue directory already exists")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   803
        os.mkdir(self.path)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   804
        if create:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   805
            return self.qrepo(create=True)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   806
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   807
    def unapplied(self, repo, patch=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   808
        if patch and patch not in self.series:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   809
            self.ui.warn("%s not in the series file\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   810
            sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   811
        if not patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   812
            start = self.series_end()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   813
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   814
            start = self.series.index(patch) + 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   815
        for p in self.series[start:]:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   816
            self.ui.write("%s\n" % p)
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   817
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   818
    def qseries(self, repo, missing=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   819
        start = self.series_end()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   820
        if not missing:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   821
            for p in self.series[:start]:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   822
                if self.ui.verbose:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   823
                    self.ui.write("%d A " % self.series.index(p))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   824
                self.ui.write("%s\n" % p)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   825
            for p in self.series[start:]:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   826
                if self.ui.verbose:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   827
                    self.ui.write("%d U " % self.series.index(p))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   828
                self.ui.write("%s\n" %  p)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   829
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   830
            list = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   831
            for root, dirs, files in os.walk(self.path):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   832
                d = root[len(self.path) + 1:]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   833
                for f in files:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   834
                    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
   835
                    if (fl not in self.series and
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
   836
                        fl not in (self.status_path, self.series_path)
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
   837
                        and not fl.startswith('.')):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   838
                        list.append(fl)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   839
            list.sort()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   840
            if list:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   841
                for x in list:
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   842
                    if self.ui.verbose:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   843
                        self.ui.write("D ")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   844
                    self.ui.write("%s\n" % x)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   845
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   846
    def issaveline(self, l):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   847
        name = l.split(':')[1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   848
        if name == '.hg.patches.save.line':
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   849
            return True
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   850
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   851
    def qrepo(self, create=False):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   852
        if create or os.path.isdir(os.path.join(self.path, ".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
   853
            return hg.repository(self.ui, path=self.path, create=create)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   854
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   855
    def restore(self, repo, rev, delete=None, qupdate=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   856
        c = repo.changelog.read(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   857
        desc = c[4].strip()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   858
        lines = desc.splitlines()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   859
        i = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   860
        datastart = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   861
        series = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   862
        applied = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   863
        qpp = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   864
        for i in xrange(0, len(lines)):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   865
            if lines[i] == 'Patch Data:':
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   866
                datastart = i + 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   867
            elif lines[i].startswith('Dirstate:'):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   868
                l = lines[i].rstrip()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   869
                l = l[10:].split(' ')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   870
                qpp = [ hg.bin(x) for x in l ]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   871
            elif datastart != None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   872
                l = lines[i].rstrip()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   873
                index = l.index(':')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   874
                id = l[:index]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   875
                file = l[index + 1:]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   876
                if id:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   877
                    applied.append(l)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   878
                series.append(file)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   879
        if datastart == None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   880
            self.ui.warn("No saved patch data found\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   881
            return 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   882
        self.ui.warn("restoring status: %s\n" % lines[0])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   883
        self.full_series = series
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   884
        self.applied = applied
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   885
        self.read_series(self.full_series)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   886
        self.series_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   887
        self.applied_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   888
        heads = repo.changelog.heads()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   889
        if delete:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   890
            if rev not in heads:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   891
                self.ui.warn("save entry has children, leaving it alone\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   892
            else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   893
                self.ui.warn("removing save entry %s\n" % hg.short(rev))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   894
                pp = repo.dirstate.parents()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   895
                if rev in pp:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   896
                    update = True
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   897
                else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   898
                    update = False
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   899
                self.strip(repo, rev, update=update, backup='strip')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   900
        if qpp:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   901
            self.ui.warn("saved queue repository parents: %s %s\n" %
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   902
                         (hg.short(qpp[0]), hg.short(qpp[1])))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   903
            if qupdate:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   904
                print "queue directory updating"
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   905
                r = self.qrepo()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   906
                if not r:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   907
                    self.ui.warn("Unable to load queue repository\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   908
                    return 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   909
                r.update(qpp[0], allow=False, force=True)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   910
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   911
    def save(self, repo, msg=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   912
        if len(self.applied) == 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   913
            self.ui.warn("save: no patches applied, exiting\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   914
            return 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   915
        if self.issaveline(self.applied[-1]):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   916
            self.ui.warn("status is already saved\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   917
            return 1
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   918
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   919
        ar = [ ':' + x for x in self.full_series ]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   920
        if not msg:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   921
            msg = "hg patches saved state"
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   922
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   923
            msg = "hg patches: " + msg.rstrip('\r\n')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   924
        r = self.qrepo()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   925
        if r:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   926
            pp = r.dirstate.parents()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   927
            msg += "\nDirstate: %s %s" % (hg.hex(pp[0]), hg.hex(pp[1]))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   928
        msg += "\n\nPatch Data:\n"
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   929
        text = msg + "\n".join(self.applied) + '\n' + (ar and "\n".join(ar)
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   930
                                                       + '\n' or "")
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   931
        n = repo.commit(None, text, user=None, force=1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   932
        if not n:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   933
            self.ui.warn("repo commit failed\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   934
            return 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   935
        self.applied.append(revlog.hex(n) + ":" + '.hg.patches.save.line')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   936
        self.applied_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   937
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   938
    def series_end(self):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   939
        end = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   940
        if len(self.applied) > 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   941
            (top, p) = self.applied[-1].split(':')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   942
            try:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   943
                end = self.series.index(p)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   944
            except ValueError:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   945
                return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   946
            return end + 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   947
        return end
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   948
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   949
    def qapplied(self, repo, patch=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   950
        if patch and patch not in self.series:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   951
            self.ui.warn("%s not in the series file\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   952
            sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   953
        if not patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   954
            end = len(self.applied)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   955
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   956
            end = self.series.index(patch) + 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   957
        for x in xrange(end):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   958
            p = self.appliedname(x)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   959
            self.ui.write("%s\n" % p)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   960
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   961
    def appliedname(self, index):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   962
        p = self.applied[index]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   963
        if not self.ui.verbose:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   964
            p = p.split(':')[1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   965
        return p
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   966
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   967
    def top(self, repo):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   968
        if len(self.applied):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   969
            p = self.appliedname(-1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   970
            self.ui.write(p + '\n')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   971
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   972
            self.ui.write("No patches applied\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   973
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   974
    def next(self, repo):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   975
        end = self.series_end()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   976
        if end == len(self.series):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   977
            self.ui.write("All patches applied\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   978
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   979
            self.ui.write(self.series[end] + '\n')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   980
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   981
    def prev(self, repo):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   982
        if len(self.applied) > 1:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   983
            p = self.appliedname(-2)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   984
            self.ui.write(p + '\n')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   985
        elif len(self.applied) == 1:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   986
            self.ui.write("Only one patch applied\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   987
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   988
            self.ui.write("No patches applied\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   989
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   990
    def qimport(self, repo, files, patch=None, existing=None, force=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   991
        if len(files) > 1 and patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   992
            self.ui.warn("-n option not valid when importing multiple files\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   993
            sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   994
        i = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   995
        for filename in files:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   996
            if existing:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   997
                if not patch:
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   998
                    patch = filename
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   999
                if not os.path.isfile(os.path.join(self.path, patch)):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1000
                    self.ui.warn("patch %s does not exist\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1001
                    sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1002
            else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1003
                try:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1004
                    text = file(filename).read()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1005
                except IOError:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1006
                    self.ui.warn("Unable to read %s\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1007
                    sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1008
                if not patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1009
                    patch = os.path.split(filename)[1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1010
                if not force and os.path.isfile(os.path.join(self.path, patch)):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1011
                    self.ui.warn("patch %s already exists\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1012
                    sys.exit(1)
1852
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
  1013
                patchf = self.opener(patch, "w")
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1014
                patchf.write(text)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1015
            if patch in self.series:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1016
                self.ui.warn("patch %s is already in the series file\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1017
                sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1018
            index = self.series_end() + i
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1019
            self.full_series[index:index] = [patch]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1020
            self.read_series(self.full_series)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1021
            self.ui.warn("adding %s to series file\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1022
            i += 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1023
            patch = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1024
        self.series_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1025
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1026
def delete(ui, repo, patch, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1027
    """remove a patch from the series file"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1028
    q = repomap[repo]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1029
    q.delete(repo, patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1030
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1031
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1032
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1033
def applied(ui, repo, patch=None, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1034
    """print the patches already applied"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1035
    repomap[repo].qapplied(repo, patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1036
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1037
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1038
def unapplied(ui, repo, patch=None, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1039
    """print the patches not yet applied"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1040
    repomap[repo].unapplied(repo, patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1041
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1042
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1043
def qimport(ui, repo, *filename, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1044
    """import a patch"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1045
    q = repomap[repo]
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1046
    q.qimport(repo, filename, patch=opts['name'],
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1047
              existing=opts['existing'], force=opts['force'])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1048
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1049
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1050
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1051
def init(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1052
    """init a new queue repository"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1053
    q = repomap[repo]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1054
    r = q.init(repo, create=opts['create_repo'])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1055
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1056
    if r:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1057
        fp = r.wopener('.hgignore', 'w')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1058
        print >> fp, 'syntax: glob'
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1059
        print >> fp, 'status'
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1060
        fp.close()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1061
        r.wopener('series', 'w').close()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1062
        r.add(['.hgignore', 'series'])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1063
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1064
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1065
def commit(ui, repo, *pats, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1066
    q = repomap[repo]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1067
    r = q.qrepo()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1068
    if not r: raise util.Abort('no queue repository')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1069
    commands.commit(r.ui, r, *pats, **opts)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1070
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1071
def series(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1072
    """print the entire series file"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1073
    repomap[repo].qseries(repo, missing=opts['missing'])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1074
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1075
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1076
def top(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1077
    """print the name of the current patch"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1078
    repomap[repo].top(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1079
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1080
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1081
def next(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1082
    """print the name of the next patch"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1083
    repomap[repo].next(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1084
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1085
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1086
def prev(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1087
    """print the name of the previous patch"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1088
    repomap[repo].prev(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1089
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1090
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1091
def new(ui, repo, patch, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1092
    """create a new patch"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1093
    q = repomap[repo]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1094
    q.new(repo, patch, msg=opts['message'], force=opts['force'])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1095
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1096
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1097
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1098
def refresh(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1099
    """update the current patch"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1100
    q = repomap[repo]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1101
    q.refresh(repo, short=opts['short'])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1102
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1103
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1104
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1105
def diff(ui, repo, *files, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1106
    """diff of the current patch"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1107
    repomap[repo].diff(repo, files)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1108
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1109
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1110
def lastsavename(path):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1111
    (dir, base) = os.path.split(path)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1112
    names = os.listdir(dir)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1113
    namere = re.compile("%s.([0-9]+)" % base)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1114
    max = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1115
    maxname = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1116
    for f in names:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1117
        m = namere.match(f)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1118
        if m:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1119
            index = int(m.group(1))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1120
            if max == None or index > max:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1121
                max = index
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1122
                maxname = f
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1123
    if maxname:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1124
        return (os.path.join(dir, maxname), max)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1125
    return (None, None)
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1126
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1127
def savename(path):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1128
    (last, index) = lastsavename(path)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1129
    if last is None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1130
        index = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1131
    newpath = path + ".%d" % (index + 1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1132
    return newpath
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1133
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1134
def push(ui, repo, patch=None, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1135
    """push the next patch onto the stack"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1136
    q = repomap[repo]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1137
    mergeq = None
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1138
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1139
    if opts['all']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1140
        patch = q.series[-1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1141
    if opts['merge']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1142
        if opts['name']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1143
            newpath = opts['name']
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1144
        else:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1145
            newpath, i = lastsavename(q.path)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1146
        if not newpath:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1147
            ui.warn("no saved queues found, please use -n\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1148
            return 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1149
        mergeq = queue(ui, repo.join(""), newpath)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1150
        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
  1151
    ret = q.push(repo, patch, force=opts['force'], list=opts['list'],
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1152
                 mergeq=mergeq)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1153
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1154
    return ret
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1155
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1156
def pop(ui, repo, patch=None, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1157
    """pop the current patch off the stack"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1158
    localupdate = True
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1159
    if opts['name']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1160
        q = queue(ui, repo.join(""), repo.join(opts['name']))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1161
        ui.warn('using patch queue: %s\n' % q.path)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1162
        localupdate = False
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1163
    else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1164
        q = repomap[repo]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1165
    if opts['all'] and len(q.applied) > 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1166
        patch = q.applied[0].split(':')[1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1167
    q.pop(repo, patch, force=opts['force'], update=localupdate)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1168
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1169
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1170
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1171
def restore(ui, repo, rev, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1172
    """restore the queue state saved by a rev"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1173
    rev = repo.lookup(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1174
    q = repomap[repo]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1175
    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
  1176
              qupdate=opts['update'])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1177
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1178
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1179
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1180
def save(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1181
    """save current queue state"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1182
    q = repomap[repo]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1183
    ret = q.save(repo, msg=opts['message'])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1184
    if ret:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1185
        return ret
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1186
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1187
    if opts['copy']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1188
        path = q.path
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1189
        if opts['name']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1190
            newpath = os.path.join(q.basepath, opts['name'])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1191
            if os.path.exists(newpath):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1192
                if not os.path.isdir(newpath):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1193
                    ui.warn("destination %s exists and is not a directory\n" %
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1194
                            newpath)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1195
                    sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1196
                if not opts['force']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1197
                    ui.warn("destination %s exists, use -f to force\n" %
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1198
                            newpath)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1199
                    sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1200
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1201
            newpath = savename(path)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1202
        ui.warn("copy %s to %s\n" % (path, newpath))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1203
        util.copyfiles(path, newpath)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1204
    if opts['empty']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1205
        try:
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
  1206
            os.unlink(os.path.join(q.path, q.status_path))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1207
        except:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1208
            pass
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1209
    return 0
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1210
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1211
def strip(ui, repo, rev, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1212
    """strip a revision and all later revs on the same branch"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1213
    rev = repo.lookup(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1214
    backup = 'all'
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1215
    if opts['backup']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1216
        backup = 'strip'
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1217
    elif opts['nobackup']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1218
        backup = 'none'
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1219
    repomap[repo].strip(repo, rev, backup=backup)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1220
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1221
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1222
def version(ui, q=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1223
    """print the version number"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1224
    ui.write("mq version %s\n" % versionstr)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1225
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1226
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1227
def reposetup(ui, repo):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1228
    repomap[repo] = queue(ui, repo.join(""))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1229
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1230
cmdtable = {
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1231
    "qapplied": (applied, [], 'hg qapplied [patch]'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1232
    "qcommit|qci":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1233
        (commit,
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1234
         [('A', 'addremove', None, _('run addremove during commit')),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1235
          ('I', 'include', [], _('include names matching the given patterns')),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1236
          ('X', 'exclude', [], _('exclude names matching the given patterns')),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1237
          ('m', 'message', '', _('use <text> as commit message')),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1238
          ('l', 'logfile', '', _('read the commit message from <file>')),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1239
          ('d', 'date', '', _('record datecode as commit date')),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1240
          ('u', 'user', '', _('record user as commiter'))],
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1241
         'hg qcommit [options] [files]'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1242
    "^qdiff": (diff, [], 'hg qdiff [files]'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1243
    "qdelete": (delete, [], 'hg qdelete [patch]'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1244
    "^qimport":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1245
        (qimport,
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1246
         [('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
  1247
          ('n', 'name', '', 'patch file name'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1248
          ('f', 'force', None, 'overwrite existing files')],
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1249
         'hg qimport'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1250
    "^qinit":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1251
        (init,
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1252
         [('c', 'create-repo', None, 'create patch repository')],
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1253
         'hg [-c] qinit'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1254
    "qnew":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1255
        (new,
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1256
         [('m', 'message', '', 'commit message'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1257
          ('f', 'force', None, 'force')],
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1258
         'hg qnew [-m message ] patch'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1259
    "qnext": (next, [], 'hg qnext'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1260
    "qprev": (prev, [], 'hg qprev'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1261
    "^qpop":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1262
        (pop,
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1263
         [('a', 'all', None, 'pop all patches'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1264
          ('n', 'name', '', 'queue name to pop'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1265
          ('f', 'force', None, 'forget any local changes')],
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1266
         'hg qpop [options] [patch/index]'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1267
    "^qpush":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1268
        (push,
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1269
         [('f', 'force', None, 'apply if the patch has rejects'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1270
          ('l', 'list', None, 'list patch name in commit text'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1271
          ('a', 'all', None, 'apply all patches'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1272
          ('m', 'merge', None, 'merge from another queue'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1273
          ('n', 'name', '', 'merge queue name')],
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1274
         'hg qpush [options] [patch/index]'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1275
    "^qrefresh":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1276
        (refresh,
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1277
         [('s', 'short', None, 'short refresh')],
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1278
         'hg qrefresh'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1279
    "qrestore":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1280
        (restore,
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1281
         [('d', 'delete', None, 'delete save entry'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1282
          ('u', 'update', None, 'update queue working dir')],
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1283
         'hg qrestore rev'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1284
    "qsave":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1285
        (save,
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1286
         [('m', 'message', '', 'commit message'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1287
          ('c', 'copy', None, 'copy patch directory'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1288
          ('n', 'name', '', 'copy directory name'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1289
          ('e', 'empty', None, 'clear queue status file'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1290
          ('f', 'force', None, 'force copy')],
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1291
         'hg qsave'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1292
    "qseries":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1293
        (series,
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1294
         [('m', 'missing', None, 'print patches not in series')],
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1295
         'hg qseries'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1296
    "^strip":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1297
        (strip,
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1298
         [('f', 'force', None, 'force multi-head removal'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1299
          ('b', 'backup', None, 'bundle unrelated changesets'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1300
          ('n', 'nobackup', None, 'no backups')],
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1301
         'hg strip rev'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1302
    "qtop": (top, [], 'hg qtop'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1303
    "qunapplied": (unapplied, [], 'hg qunapplied [patch]'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1304
    "qversion": (version, [], 'hg qversion')
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1305
}
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1306