hgext/mq.py
author Martin Geisler <mg@lazybytes.net>
Mon, 31 May 2010 21:37:01 +0200
branchstable
changeset 11249 0bb67503ad4b
parent 11073 ee5b112aa529
child 11078 37d1b20168d1
permissions -rw-r--r--
eol: extension for managing file EOLs
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6187
531f3e78c6f2 mq: Cleanup: update outdated file header.
Marti Raudsepp <marti@juffo.org>
parents: 6164
diff changeset
     1
# mq.py - patch queues for mercurial
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
     2
#
2859
345bac2bc4ec update copyrights.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2856
diff changeset
     3
# Copyright 2005, 2006 Chris Mason <mason@suse.com>
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
     4
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8209
diff changeset
     5
# This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 10186
diff changeset
     6
# GNU General Public License version 2 or any later version.
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
     7
8932
f87884329419 extensions: fix up description lines some more
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8929
diff changeset
     8
'''manage a stack of patches
2554
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
     9
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    10
This extension lets you work with a stack of patches in a Mercurial
7983
7b813bdbd5d0 Change double spaces to single spaces in help texts.
Martin Geisler <mg@daimi.au.dk>
parents: 7874
diff changeset
    11
repository. It manages two stacks of patches - all known patches, and
2554
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    12
applied patches (subset of known patches).
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    13
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    14
Known patches are represented as patch files in the .hg/patches
7983
7b813bdbd5d0 Change double spaces to single spaces in help texts.
Martin Geisler <mg@daimi.au.dk>
parents: 7874
diff changeset
    15
directory. Applied patches are both patch files and changesets.
2554
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    16
9157
9261667e9b82 commands: use minirst parser when displaying help
Martin Geisler <mg@lazybytes.net>
parents: 9111
diff changeset
    17
Common tasks (use "hg help command" for more details)::
2554
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    18
9157
9261667e9b82 commands: use minirst parser when displaying help
Martin Geisler <mg@lazybytes.net>
parents: 9111
diff changeset
    19
  create new patch                          qnew
9261667e9b82 commands: use minirst parser when displaying help
Martin Geisler <mg@lazybytes.net>
parents: 9111
diff changeset
    20
  import existing patch                     qimport
2554
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    21
9157
9261667e9b82 commands: use minirst parser when displaying help
Martin Geisler <mg@lazybytes.net>
parents: 9111
diff changeset
    22
  print patch series                        qseries
9261667e9b82 commands: use minirst parser when displaying help
Martin Geisler <mg@lazybytes.net>
parents: 9111
diff changeset
    23
  print applied patches                     qapplied
2554
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    24
9157
9261667e9b82 commands: use minirst parser when displaying help
Martin Geisler <mg@lazybytes.net>
parents: 9111
diff changeset
    25
  add known patch to applied stack          qpush
9261667e9b82 commands: use minirst parser when displaying help
Martin Geisler <mg@lazybytes.net>
parents: 9111
diff changeset
    26
  remove patch from applied stack           qpop
9261667e9b82 commands: use minirst parser when displaying help
Martin Geisler <mg@lazybytes.net>
parents: 9111
diff changeset
    27
  refresh contents of top applied patch     qrefresh
10190
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
    28
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
    29
By default, mq will automatically use git patches when required to
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
    30
avoid losing file mode changes, copy records, binary files or empty
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
    31
files creations or deletions. This behaviour can be configured with::
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
    32
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
    33
  [mq]
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
    34
  git = auto/keep/yes/no
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
    35
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
    36
If set to 'keep', mq will obey the [diff] section configuration while
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
    37
preserving existing git patches upon qrefresh. If set to 'yes' or
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
    38
'no', mq will override the [diff] section and always generate git or
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
    39
regular patches, possibly losing data in the second case.
2554
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    40
'''
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    41
3891
6b4127c7d52a Simplify i18n imports
Matt Mackall <mpm@selenic.com>
parents: 3877
diff changeset
    42
from mercurial.i18n import _
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
    43
from mercurial.node import bin, hex, short, nullid, nullrev
8112
6ee71f78497c switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8076
diff changeset
    44
from mercurial.lock import release
10410
b59fba37e5e6 mq: remove unused import
Henrik Stuart <hg@hstuart.dk>
parents: 10407
diff changeset
    45
from mercurial import commands, cmdutil, hg, patch, util
7637
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 7627
diff changeset
    46
from mercurial import repair, extensions, url, error
7271
8046f0a070a6 use our urlopener (proxy handling, etc) instead of urllib
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7216
diff changeset
    47
import os, sys, re, errno
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    48
5645
1f044b04fa0a mq: drop obsolete reference to 'qversion'
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 5534
diff changeset
    49
commands.norepo += " qclone"
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
    50
4037
bbdba01cce28 Enforce unixish style for all generated patch names.
Patrick Mezard <pmezard@gmail.com>
parents: 4016
diff changeset
    51
# Patch names looks like unix-file names.
bbdba01cce28 Enforce unixish style for all generated patch names.
Patrick Mezard <pmezard@gmail.com>
parents: 4016
diff changeset
    52
# They must be joinable with queue directory and result in the patch path.
bbdba01cce28 Enforce unixish style for all generated patch names.
Patrick Mezard <pmezard@gmail.com>
parents: 4016
diff changeset
    53
normname = util.normpath
bbdba01cce28 Enforce unixish style for all generated patch names.
Patrick Mezard <pmezard@gmail.com>
parents: 4016
diff changeset
    54
8778
c5f36402daad use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8761
diff changeset
    55
class statusentry(object):
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
    56
    def __init__(self, rev, name=None):
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
    57
        if not name:
3091
7fa3d38a99b6 mq: handle patch names containing ":"
Brendan Cully <brendan@kublai.com>
parents: 3088
diff changeset
    58
            fields = rev.split(':', 1)
2816
52516e48e3f3 Update qsave to use StatusEntry; don't throw exception on bad status lines.
Brendan Cully <brendan@kublai.com>
parents: 2804
diff changeset
    59
            if len(fields) == 2:
52516e48e3f3 Update qsave to use StatusEntry; don't throw exception on bad status lines.
Brendan Cully <brendan@kublai.com>
parents: 2804
diff changeset
    60
                self.rev, self.name = fields
52516e48e3f3 Update qsave to use StatusEntry; don't throw exception on bad status lines.
Brendan Cully <brendan@kublai.com>
parents: 2804
diff changeset
    61
            else:
52516e48e3f3 Update qsave to use StatusEntry; don't throw exception on bad status lines.
Brendan Cully <brendan@kublai.com>
parents: 2804
diff changeset
    62
                self.rev, self.name = None, None
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
    63
        else:
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
    64
            self.rev, self.name = rev, name
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
    65
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
    66
    def __str__(self):
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
    67
        return self.rev + ':' + self.name
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
    68
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
    69
class patchheader(object):
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
    70
    def __init__(self, pf, plainmode=False):
8653
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
    71
        def eatdiff(lines):
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
    72
            while lines:
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
    73
                l = lines[-1]
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
    74
                if (l.startswith("diff -") or
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
    75
                    l.startswith("Index:") or
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
    76
                    l.startswith("===========")):
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
    77
                    del lines[-1]
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
    78
                else:
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
    79
                    break
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
    80
        def eatempty(lines):
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
    81
            while lines:
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
    82
                l = lines[-1]
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
    83
                if re.match('\s*$', l):
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
    84
                    del lines[-1]
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
    85
                else:
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
    86
                    break
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
    87
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
    88
        message = []
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
    89
        comments = []
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
    90
        user = None
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
    91
        date = None
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
    92
        parent = None
8653
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
    93
        format = None
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
    94
        subject = None
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
    95
        diffstart = 0
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
    96
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
    97
        for line in file(pf):
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
    98
            line = line.rstrip()
10730
4d6bd7b8b6d8 mq: allow lines starting with '--- ' in patch messages
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10691
diff changeset
    99
            if (line.startswith('diff --git')
4d6bd7b8b6d8 mq: allow lines starting with '--- ' in patch messages
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10691
diff changeset
   100
                or (diffstart and line.startswith('+++ '))):
8653
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   101
                diffstart = 2
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   102
                break
10730
4d6bd7b8b6d8 mq: allow lines starting with '--- ' in patch messages
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10691
diff changeset
   103
            diffstart = 0 # reset
8653
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   104
            if line.startswith("--- "):
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   105
                diffstart = 1
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   106
                continue
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   107
            elif format == "hgpatch":
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   108
                # parse values when importing the result of an hg export
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   109
                if line.startswith("# User "):
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   110
                    user = line[7:]
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   111
                elif line.startswith("# Date "):
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   112
                    date = line[7:]
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   113
                elif line.startswith("# Parent "):
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   114
                    parent = line[9:]
8653
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   115
                elif not line.startswith("# ") and line:
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   116
                    message.append(line)
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   117
                    format = None
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   118
            elif line == '# HG changeset patch':
9287
53fdf18fd63b mq: Parse commit message after we find start of changeset patch
David Soria Parra <dsp@php.net>
parents: 8948
diff changeset
   119
                message = []
8653
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   120
                format = "hgpatch"
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   121
            elif (format != "tagdone" and (line.startswith("Subject: ") or
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   122
                                           line.startswith("subject: "))):
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   123
                subject = line[9:]
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   124
                format = "tag"
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   125
            elif (format != "tagdone" and (line.startswith("From: ") or
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   126
                                           line.startswith("from: "))):
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   127
                user = line[6:]
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   128
                format = "tag"
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   129
            elif (format != "tagdone" and (line.startswith("Date: ") or
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   130
                                           line.startswith("date: "))):
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   131
                date = line[6:]
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   132
                format = "tag"
8653
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   133
            elif format == "tag" and line == "":
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   134
                # when looking for tags (subject: from: etc) they
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   135
                # end once you find a blank line in the source
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   136
                format = "tagdone"
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   137
            elif message or line:
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   138
                message.append(line)
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   139
            comments.append(line)
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   140
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   141
        eatdiff(message)
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   142
        eatdiff(comments)
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   143
        eatempty(message)
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   144
        eatempty(comments)
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   145
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   146
        # make sure message isn't empty
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   147
        if format and format.startswith("tag") and subject:
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   148
            message.insert(0, "")
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   149
            message.insert(0, subject)
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   150
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   151
        self.message = message
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   152
        self.comments = comments
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   153
        self.user = user
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   154
        self.date = date
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   155
        self.parent = parent
8653
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   156
        self.haspatch = diffstart > 1
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   157
        self.plainmode = plainmode
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   158
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   159
    def setuser(self, user):
8654
f6cc3638f468 mq: rename setheader to updateheader and fix comment
Cédric Duval <cedricduval@free.fr>
parents: 8653
diff changeset
   160
        if not self.updateheader(['From: ', '# User '], user):
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   161
            try:
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   162
                patchheaderat = self.comments.index('# HG changeset patch')
9334
08f59f7916f9 mq: fix coding style in qrefresh
Yann E. MORIN <yann.morin.1998@anciens.enib.fr>
parents: 9327
diff changeset
   163
                self.comments.insert(patchheaderat + 1, '# User ' + user)
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   164
            except ValueError:
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   165
                if self.plainmode or self._hasheader(['Date: ']):
9336
dd6f605b15c0 mq: upgrade the patch to HG format when adding the author name with qrefresh
Yann E. MORIN <yann.morin.1998@anciens.enib.fr>
parents: 9335
diff changeset
   166
                    self.comments = ['From: ' + user] + self.comments
dd6f605b15c0 mq: upgrade the patch to HG format when adding the author name with qrefresh
Yann E. MORIN <yann.morin.1998@anciens.enib.fr>
parents: 9335
diff changeset
   167
                else:
dd6f605b15c0 mq: upgrade the patch to HG format when adding the author name with qrefresh
Yann E. MORIN <yann.morin.1998@anciens.enib.fr>
parents: 9335
diff changeset
   168
                    tmp = ['# HG changeset patch', '# User ' + user, '']
dd6f605b15c0 mq: upgrade the patch to HG format when adding the author name with qrefresh
Yann E. MORIN <yann.morin.1998@anciens.enib.fr>
parents: 9335
diff changeset
   169
                    self.comments = tmp + self.comments
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   170
        self.user = user
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   171
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   172
    def setdate(self, date):
9337
2b1260436f83 mq: add the date with qrefresh, even if missing (issue1768)
Yann E. MORIN <yann.morin.1998@anciens.enib.fr>
parents: 9336
diff changeset
   173
        if not self.updateheader(['Date: ', '# Date '], date):
2b1260436f83 mq: add the date with qrefresh, even if missing (issue1768)
Yann E. MORIN <yann.morin.1998@anciens.enib.fr>
parents: 9336
diff changeset
   174
            try:
2b1260436f83 mq: add the date with qrefresh, even if missing (issue1768)
Yann E. MORIN <yann.morin.1998@anciens.enib.fr>
parents: 9336
diff changeset
   175
                patchheaderat = self.comments.index('# HG changeset patch')
2b1260436f83 mq: add the date with qrefresh, even if missing (issue1768)
Yann E. MORIN <yann.morin.1998@anciens.enib.fr>
parents: 9336
diff changeset
   176
                self.comments.insert(patchheaderat + 1, '# Date ' + date)
2b1260436f83 mq: add the date with qrefresh, even if missing (issue1768)
Yann E. MORIN <yann.morin.1998@anciens.enib.fr>
parents: 9336
diff changeset
   177
            except ValueError:
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   178
                if self.plainmode or self._hasheader(['From: ']):
9337
2b1260436f83 mq: add the date with qrefresh, even if missing (issue1768)
Yann E. MORIN <yann.morin.1998@anciens.enib.fr>
parents: 9336
diff changeset
   179
                    self.comments = ['Date: ' + date] + self.comments
2b1260436f83 mq: add the date with qrefresh, even if missing (issue1768)
Yann E. MORIN <yann.morin.1998@anciens.enib.fr>
parents: 9336
diff changeset
   180
                else:
2b1260436f83 mq: add the date with qrefresh, even if missing (issue1768)
Yann E. MORIN <yann.morin.1998@anciens.enib.fr>
parents: 9336
diff changeset
   181
                    tmp = ['# HG changeset patch', '# Date ' + date, '']
2b1260436f83 mq: add the date with qrefresh, even if missing (issue1768)
Yann E. MORIN <yann.morin.1998@anciens.enib.fr>
parents: 9336
diff changeset
   182
                    self.comments = tmp + self.comments
2b1260436f83 mq: add the date with qrefresh, even if missing (issue1768)
Yann E. MORIN <yann.morin.1998@anciens.enib.fr>
parents: 9336
diff changeset
   183
        self.date = date
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   184
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   185
    def setparent(self, parent):
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   186
        if not self.updateheader(['# Parent '], parent):
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   187
            try:
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   188
                patchheaderat = self.comments.index('# HG changeset patch')
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   189
                self.comments.insert(patchheaderat + 1, '# Parent ' + parent)
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   190
            except ValueError:
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   191
                pass
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   192
        self.parent = parent
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   193
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   194
    def setmessage(self, message):
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   195
        if self.comments:
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   196
            self._delmsg()
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   197
        self.message = [message]
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   198
        self.comments += self.message
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   199
8654
f6cc3638f468 mq: rename setheader to updateheader and fix comment
Cédric Duval <cedricduval@free.fr>
parents: 8653
diff changeset
   200
    def updateheader(self, prefixes, new):
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   201
        '''Update all references to a field in the patch header.
8654
f6cc3638f468 mq: rename setheader to updateheader and fix comment
Cédric Duval <cedricduval@free.fr>
parents: 8653
diff changeset
   202
        Return whether the field is present.'''
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   203
        res = False
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   204
        for prefix in prefixes:
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   205
            for i in xrange(len(self.comments)):
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   206
                if self.comments[i].startswith(prefix):
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   207
                    self.comments[i] = prefix + new
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   208
                    res = True
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   209
                    break
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   210
        return res
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   211
9335
6eaadd777bc4 mq: add function to check if a header exists in a patch
Yann E. MORIN <yann.morin.1998@anciens.enib.fr>
parents: 9334
diff changeset
   212
    def _hasheader(self, prefixes):
6eaadd777bc4 mq: add function to check if a header exists in a patch
Yann E. MORIN <yann.morin.1998@anciens.enib.fr>
parents: 9334
diff changeset
   213
        '''Check if a header starts with any of the given prefixes.'''
6eaadd777bc4 mq: add function to check if a header exists in a patch
Yann E. MORIN <yann.morin.1998@anciens.enib.fr>
parents: 9334
diff changeset
   214
        for prefix in prefixes:
6eaadd777bc4 mq: add function to check if a header exists in a patch
Yann E. MORIN <yann.morin.1998@anciens.enib.fr>
parents: 9334
diff changeset
   215
            for comment in self.comments:
6eaadd777bc4 mq: add function to check if a header exists in a patch
Yann E. MORIN <yann.morin.1998@anciens.enib.fr>
parents: 9334
diff changeset
   216
                if comment.startswith(prefix):
6eaadd777bc4 mq: add function to check if a header exists in a patch
Yann E. MORIN <yann.morin.1998@anciens.enib.fr>
parents: 9334
diff changeset
   217
                    return True
6eaadd777bc4 mq: add function to check if a header exists in a patch
Yann E. MORIN <yann.morin.1998@anciens.enib.fr>
parents: 9334
diff changeset
   218
        return False
6eaadd777bc4 mq: add function to check if a header exists in a patch
Yann E. MORIN <yann.morin.1998@anciens.enib.fr>
parents: 9334
diff changeset
   219
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   220
    def __str__(self):
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   221
        if not self.comments:
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   222
            return ''
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   223
        return '\n'.join(self.comments) + '\n\n'
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   224
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   225
    def _delmsg(self):
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   226
        '''Remove existing message, keeping the rest of the comments fields.
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   227
        If comments contains 'subject: ', message will prepend
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   228
        the field and a blank line.'''
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   229
        if self.message:
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   230
            subj = 'subject: ' + self.message[0].lower()
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   231
            for i in xrange(len(self.comments)):
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   232
                if subj == self.comments[i].lower():
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   233
                    del self.comments[i]
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   234
                    self.message = self.message[2:]
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   235
                    break
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   236
        ci = 0
8632
9e055cfdd620 replace "i in range(len(xs))" with "i, x in enumerate(xs)"
Martin Geisler <mg@lazybytes.net>
parents: 8624
diff changeset
   237
        for mi in self.message:
9e055cfdd620 replace "i in range(len(xs))" with "i, x in enumerate(xs)"
Martin Geisler <mg@lazybytes.net>
parents: 8624
diff changeset
   238
            while mi != self.comments[ci]:
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   239
                ci += 1
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   240
            del self.comments[ci]
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   241
8778
c5f36402daad use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8761
diff changeset
   242
class queue(object):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   243
    def __init__(self, ui, path, patchdir=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   244
        self.basepath = path
2819
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
   245
        self.path = patchdir or os.path.join(path, "patches")
1852
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
   246
        self.opener = util.opener(self.path)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   247
        self.ui = ui
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   248
        self.applied_dirty = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   249
        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
   250
        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
   251
        self.status_path = "status"
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   252
        self.guards_path = "guards"
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   253
        self.active_guards = None
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   254
        self.guards_dirty = False
10190
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   255
        # Handle mq.git as a bool with extended values
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   256
        try:
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   257
            gitmode = ui.configbool('mq', 'git', None)
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   258
            if gitmode is None:
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   259
                raise error.ConfigError()
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   260
            self.gitmode = gitmode and 'yes' or 'no'
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   261
        except error.ConfigError:
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   262
            self.gitmode = ui.config('mq', 'git', 'auto').lower()
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   263
        self.plainmode = ui.configbool('mq', 'plain', False)
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   264
8524
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   265
    @util.propertycache
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   266
    def applied(self):
2819
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
   267
        if os.path.exists(self.join(self.status_path)):
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   268
            lines = self.opener(self.status_path).read().splitlines()
8524
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   269
            return [statusentry(l) for l in lines]
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   270
        return []
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   271
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   272
    @util.propertycache
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   273
    def full_series(self):
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   274
        if os.path.exists(self.join(self.series_path)):
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   275
            return self.opener(self.series_path).read().splitlines()
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   276
        return []
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   277
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   278
    @util.propertycache
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   279
    def series(self):
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   280
        self.parse_series()
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   281
        return self.series
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   282
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   283
    @util.propertycache
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   284
    def series_guards(self):
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   285
        self.parse_series()
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   286
        return self.series_guards
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   287
8525
b169ba60eebe mq: new method invalidate
Simon Heimberg <simohe@besonet.ch>
parents: 8524
diff changeset
   288
    def invalidate(self):
b169ba60eebe mq: new method invalidate
Simon Heimberg <simohe@besonet.ch>
parents: 8524
diff changeset
   289
        for a in 'applied full_series series series_guards'.split():
b169ba60eebe mq: new method invalidate
Simon Heimberg <simohe@besonet.ch>
parents: 8524
diff changeset
   290
            if a in self.__dict__:
b169ba60eebe mq: new method invalidate
Simon Heimberg <simohe@besonet.ch>
parents: 8524
diff changeset
   291
                delattr(self, a)
b169ba60eebe mq: new method invalidate
Simon Heimberg <simohe@besonet.ch>
parents: 8524
diff changeset
   292
        self.applied_dirty = 0
b169ba60eebe mq: new method invalidate
Simon Heimberg <simohe@besonet.ch>
parents: 8524
diff changeset
   293
        self.series_dirty = 0
b169ba60eebe mq: new method invalidate
Simon Heimberg <simohe@besonet.ch>
parents: 8524
diff changeset
   294
        self.guards_dirty = False
b169ba60eebe mq: new method invalidate
Simon Heimberg <simohe@besonet.ch>
parents: 8524
diff changeset
   295
        self.active_guards = None
b169ba60eebe mq: new method invalidate
Simon Heimberg <simohe@besonet.ch>
parents: 8524
diff changeset
   296
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
   297
    def diffopts(self, opts={}, patchfn=None):
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
   298
        diffopts = patch.diffopts(self.ui, opts)
10190
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   299
        if self.gitmode == 'auto':
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   300
            diffopts.upgrade = True
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   301
        elif self.gitmode == 'keep':
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   302
            pass
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   303
        elif self.gitmode in ('yes', 'no'):
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   304
            diffopts.git = self.gitmode == 'yes'
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   305
        else:
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   306
            raise util.Abort(_('mq.git option can be auto/keep/yes/no'
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   307
                               ' got %s') % self.gitmode)
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
   308
        if patchfn:
10185
7637fe4f525d mq: preserve --git flag when merging patches
Patrick Mezard <pmezard@gmail.com>
parents: 10184
diff changeset
   309
            diffopts = self.patchopts(diffopts, patchfn)
7637fe4f525d mq: preserve --git flag when merging patches
Patrick Mezard <pmezard@gmail.com>
parents: 10184
diff changeset
   310
        return diffopts
7637fe4f525d mq: preserve --git flag when merging patches
Patrick Mezard <pmezard@gmail.com>
parents: 10184
diff changeset
   311
10186
296a0b14a686 mq: preserve --git flag when folding patches
Patrick Mezard <pmezard@gmail.com>
parents: 10185
diff changeset
   312
    def patchopts(self, diffopts, *patches):
10185
7637fe4f525d mq: preserve --git flag when merging patches
Patrick Mezard <pmezard@gmail.com>
parents: 10184
diff changeset
   313
        """Return a copy of input diff options with git set to true if
10190
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   314
        referenced patch is a git patch and should be preserved as such.
10185
7637fe4f525d mq: preserve --git flag when merging patches
Patrick Mezard <pmezard@gmail.com>
parents: 10184
diff changeset
   315
        """
7637fe4f525d mq: preserve --git flag when merging patches
Patrick Mezard <pmezard@gmail.com>
parents: 10184
diff changeset
   316
        diffopts = diffopts.copy()
10190
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   317
        if not diffopts.git and self.gitmode == 'keep':
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   318
            for patchfn in patches:
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   319
                patchf = self.opener(patchfn, 'r')
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   320
                # if the patch was a git patch, refresh it as a git patch
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   321
                for line in patchf:
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   322
                    if line.startswith('diff --git'):
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   323
                        diffopts.git = True
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   324
                        break
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   325
                patchf.close()
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
   326
        return diffopts
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
   327
2819
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
   328
    def join(self, *p):
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
   329
        return os.path.join(self.path, *p)
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
   330
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   331
    def find_series(self, patch):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   332
        pre = re.compile("(\s*)([^#]+)")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   333
        index = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   334
        for l in self.full_series:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   335
            m = pre.match(l)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   336
            if m:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   337
                s = m.group(2)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   338
                s = s.rstrip()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   339
                if s == patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   340
                    return index
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   341
            index += 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   342
        return None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   343
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   344
    guard_re = re.compile(r'\s?#([-+][^-+# \t\r\n\f][^# \t\r\n\f]*)')
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   345
2767
60683ab1ed33 mq: rename read_series as parse_series, make simpler and faster
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2766
diff changeset
   346
    def parse_series(self):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   347
        self.series = []
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   348
        self.series_guards = []
2767
60683ab1ed33 mq: rename read_series as parse_series, make simpler and faster
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2766
diff changeset
   349
        for l in self.full_series:
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   350
            h = l.find('#')
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   351
            if h == -1:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   352
                patch = l
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   353
                comment = ''
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   354
            elif h == 0:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   355
                continue
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   356
            else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   357
                patch = l[:h]
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   358
                comment = l[h:]
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   359
            patch = patch.strip()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   360
            if patch:
3184
87b7ae306d54 mq: bail out if a patch appears more than once in the series file.
Brendan Cully <brendan@kublai.com>
parents: 3183
diff changeset
   361
                if patch in self.series:
87b7ae306d54 mq: bail out if a patch appears more than once in the series file.
Brendan Cully <brendan@kublai.com>
parents: 3183
diff changeset
   362
                    raise util.Abort(_('%s appears more than once in %s') %
87b7ae306d54 mq: bail out if a patch appears more than once in the series file.
Brendan Cully <brendan@kublai.com>
parents: 3183
diff changeset
   363
                                     (patch, self.join(self.series_path)))
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   364
                self.series.append(patch)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   365
                self.series_guards.append(self.guard_re.findall(comment))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   366
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   367
    def check_guard(self, guard):
6607
75b506f0e571 mq: make qselect fail properly on an empty guard
Patrick Mezard <pmezard@gmail.com>
parents: 6606
diff changeset
   368
        if not guard:
75b506f0e571 mq: make qselect fail properly on an empty guard
Patrick Mezard <pmezard@gmail.com>
parents: 6606
diff changeset
   369
            return _('guard cannot be an empty string')
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   370
        bad_chars = '# \t\r\n\f'
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   371
        first = guard[0]
8288
9de088320e9a mq: simpler check of first character of guard name
Simon Heimberg <simohe@besonet.ch>
parents: 8225
diff changeset
   372
        if first in '-+':
9de088320e9a mq: simpler check of first character of guard name
Simon Heimberg <simohe@besonet.ch>
parents: 8225
diff changeset
   373
            return (_('guard %r starts with invalid character: %r') %
9de088320e9a mq: simpler check of first character of guard name
Simon Heimberg <simohe@besonet.ch>
parents: 8225
diff changeset
   374
                      (guard, first))
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   375
        for c in bad_chars:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   376
            if c in guard:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   377
                return _('invalid character in guard %r: %r') % (guard, c)
3223
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3186
diff changeset
   378
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   379
    def set_active(self, guards):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   380
        for guard in guards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   381
            bad = self.check_guard(guard)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   382
            if bad:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   383
                raise util.Abort(bad)
8209
a1a5a57efe90 replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents: 8188
diff changeset
   384
        guards = sorted(set(guards))
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9440
diff changeset
   385
        self.ui.debug('active guards: %s\n' % ' '.join(guards))
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   386
        self.active_guards = guards
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   387
        self.guards_dirty = True
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   388
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   389
    def active(self):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   390
        if self.active_guards is None:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   391
            self.active_guards = []
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   392
            try:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   393
                guards = self.opener(self.guards_path).read().split()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   394
            except IOError, err:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
   395
                if err.errno != errno.ENOENT:
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
   396
                    raise
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   397
                guards = []
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   398
            for i, guard in enumerate(guards):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   399
                bad = self.check_guard(guard)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   400
                if bad:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   401
                    self.ui.warn('%s:%d: %s\n' %
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   402
                                 (self.join(self.guards_path), i + 1, bad))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   403
                else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   404
                    self.active_guards.append(guard)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   405
        return self.active_guards
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   406
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   407
    def set_guards(self, idx, guards):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   408
        for g in guards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   409
            if len(g) < 2:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   410
                raise util.Abort(_('guard %r too short') % g)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   411
            if g[0] not in '-+':
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   412
                raise util.Abort(_('guard %r starts with invalid char') % g)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   413
            bad = self.check_guard(g[1:])
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   414
            if bad:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   415
                raise util.Abort(bad)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   416
        drop = self.guard_re.sub('', self.full_series[idx])
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   417
        self.full_series[idx] = drop + ''.join([' #' + g for g in guards])
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   418
        self.parse_series()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   419
        self.series_dirty = True
3223
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3186
diff changeset
   420
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   421
    def pushable(self, idx):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   422
        if isinstance(idx, str):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   423
            idx = self.series.index(idx)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   424
        patchguards = self.series_guards[idx]
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   425
        if not patchguards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   426
            return True, None
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   427
        guards = self.active()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   428
        exactneg = [g for g in patchguards if g[0] == '-' and g[1:] in guards]
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   429
        if exactneg:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   430
            return False, exactneg[0]
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   431
        pos = [g for g in patchguards if g[0] == '+']
2850
851b07ec450c mq: apply patch is any posative guard matches
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2848
diff changeset
   432
        exactpos = [g for g in pos if g[1:] in guards]
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   433
        if pos:
2850
851b07ec450c mq: apply patch is any posative guard matches
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2848
diff changeset
   434
            if exactpos:
851b07ec450c mq: apply patch is any posative guard matches
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2848
diff changeset
   435
                return True, exactpos[0]
851b07ec450c mq: apply patch is any posative guard matches
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2848
diff changeset
   436
            return False, pos
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   437
        return True, ''
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   438
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   439
    def explain_pushable(self, idx, all_patches=False):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   440
        write = all_patches and self.ui.write or self.ui.warn
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   441
        if all_patches or self.ui.verbose:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   442
            if isinstance(idx, str):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   443
                idx = self.series.index(idx)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   444
            pushable, why = self.pushable(idx)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   445
            if all_patches and pushable:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   446
                if why is None:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   447
                    write(_('allowing %s - no guards in effect\n') %
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   448
                          self.series[idx])
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   449
                else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   450
                    if not why:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   451
                        write(_('allowing %s - no matching negative guards\n') %
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   452
                              self.series[idx])
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   453
                    else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   454
                        write(_('allowing %s - guarded by %r\n') %
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   455
                              (self.series[idx], why))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   456
            if not pushable:
2829
05316bb57d01 mq: make guards more strict, add tests
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2828
diff changeset
   457
                if why:
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   458
                    write(_('skipping %s - guarded by %r\n') %
3870
22d18051f9e5 mq: fix explain_pushable for negative guards
Brendan Cully <brendan@kublai.com>
parents: 3857
diff changeset
   459
                          (self.series[idx], why))
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   460
                else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   461
                    write(_('skipping %s - no matching guards\n') %
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   462
                          self.series[idx])
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   463
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   464
    def save_dirty(self):
2772
4720e79486d3 mq: simplify save_dirty
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2771
diff changeset
   465
        def write_list(items, path):
4720e79486d3 mq: simplify save_dirty
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2771
diff changeset
   466
            fp = self.opener(path, 'w')
4720e79486d3 mq: simplify save_dirty
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2771
diff changeset
   467
            for i in items:
5878
d39af2eabb8c transform a bunch of print statements to appropriate ui calls
Matt Mackall <mpm@selenic.com>
parents: 5788
diff changeset
   468
                fp.write("%s\n" % i)
2772
4720e79486d3 mq: simplify save_dirty
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2771
diff changeset
   469
            fp.close()
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
   470
        if self.applied_dirty:
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
   471
            write_list(map(str, self.applied), self.status_path)
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
   472
        if self.series_dirty:
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
   473
            write_list(self.full_series, self.series_path)
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
   474
        if self.guards_dirty:
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
   475
            write_list(self.active_guards, self.guards_path)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   476
4207
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4206
diff changeset
   477
    def removeundo(self, repo):
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4206
diff changeset
   478
        undo = repo.sjoin('undo')
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4206
diff changeset
   479
        if not os.path.exists(undo):
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4206
diff changeset
   480
            return
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4206
diff changeset
   481
        try:
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4206
diff changeset
   482
            os.unlink(undo)
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4206
diff changeset
   483
        except OSError, inst:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
   484
            self.ui.warn(_('error removing undo: %s\n') % str(inst))
4207
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4206
diff changeset
   485
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
   486
    def printdiff(self, repo, diffopts, node1, node2=None, files=None,
2937
9dc568f5e03d Fix test-mq-qdiff; add -I and -X options to qdiff
Brendan Cully <brendan@kublai.com>
parents: 2936
diff changeset
   487
                  fp=None, changes=None, opts={}):
9640
9e76232fbfbe diff: add --stat for diffstat output
Brodie Rao <me+hg@dackz.net>
parents: 9599
diff changeset
   488
        stat = opts.get('stat')
9e76232fbfbe diff: add --stat for diffstat output
Brodie Rao <me+hg@dackz.net>
parents: 9599
diff changeset
   489
        if stat:
9e76232fbfbe diff: add --stat for diffstat output
Brodie Rao <me+hg@dackz.net>
parents: 9599
diff changeset
   490
            opts['unified'] = '0'
9e76232fbfbe diff: add --stat for diffstat output
Brodie Rao <me+hg@dackz.net>
parents: 9599
diff changeset
   491
6582
5acbdd3941c4 walk: remove remaining users of cmdutils.matchpats
Matt Mackall <mpm@selenic.com>
parents: 6562
diff changeset
   492
        m = cmdutil.match(repo, files, opts)
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
   493
        chunks = patch.diff(repo, node1, node2, m, changes, diffopts)
7308
b6f5490effbf patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7307
diff changeset
   494
        write = fp is None and repo.ui.write or fp.write
9640
9e76232fbfbe diff: add --stat for diffstat output
Brodie Rao <me+hg@dackz.net>
parents: 9599
diff changeset
   495
        if stat:
9e76232fbfbe diff: add --stat for diffstat output
Brodie Rao <me+hg@dackz.net>
parents: 9599
diff changeset
   496
            width = self.ui.interactive() and util.termwidth() or 80
9642
7d17794f08a9 diffstat: with --git, mark binary files with Bin
Brodie Rao <me+hg@dackz.net>
parents: 9640
diff changeset
   497
            write(patch.diffstat(util.iterlines(chunks), width=width,
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
   498
                                 git=diffopts.git))
9640
9e76232fbfbe diff: add --stat for diffstat output
Brodie Rao <me+hg@dackz.net>
parents: 9599
diff changeset
   499
        else:
9e76232fbfbe diff: add --stat for diffstat output
Brodie Rao <me+hg@dackz.net>
parents: 9599
diff changeset
   500
            for chunk in chunks:
9e76232fbfbe diff: add --stat for diffstat output
Brodie Rao <me+hg@dackz.net>
parents: 9599
diff changeset
   501
                write(chunk)
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
   502
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
   503
    def mergeone(self, repo, mergeq, head, patch, rev, diffopts):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   504
        # first try just applying the patch
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
   505
        (err, n) = self.apply(repo, [patch], update_status=False,
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
   506
                              strict=True, merge=rev)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   507
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   508
        if err == 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   509
            return (err, n)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   510
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   511
        if n is None:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
   512
            raise util.Abort(_("apply failed for patch %s") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   513
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
   514
        self.ui.warn(_("patch didn't work out, merging %s\n") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   515
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   516
        # apply failed, strip away that rev and merge.
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
   517
        hg.clean(repo, head)
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
   518
        self.strip(repo, n, update=False, backup='strip')
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   519
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6668
diff changeset
   520
        ctx = repo[rev]
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
   521
        ret = hg.merge(repo, rev)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   522
        if ret:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
   523
            raise util.Abort(_("update returned %d") % ret)
8706
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8700
diff changeset
   524
        n = repo.commit(ctx.description(), ctx.user(), force=True)
8527
f9a80054dd3c use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents: 8525
diff changeset
   525
        if n is None:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
   526
            raise util.Abort(_("repo commit failed"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   527
        try:
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   528
            ph = patchheader(mergeq.join(patch), self.plainmode)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   529
        except:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
   530
            raise util.Abort(_("unable to read %s") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   531
10185
7637fe4f525d mq: preserve --git flag when merging patches
Patrick Mezard <pmezard@gmail.com>
parents: 10184
diff changeset
   532
        diffopts = self.patchopts(diffopts, patch)
1852
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
   533
        patchf = self.opener(patch, "w")
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   534
        comments = str(ph)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   535
        if comments:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   536
            patchf.write(comments)
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
   537
        self.printdiff(repo, diffopts, head, n, fp=patchf)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   538
        patchf.close()
4207
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4206
diff changeset
   539
        self.removeundo(repo)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   540
        return (0, n)
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   541
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   542
    def qparents(self, repo, rev=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   543
        if rev is None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   544
            (p1, p2) = repo.dirstate.parents()
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   545
            if p2 == nullid:
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   546
                return p1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   547
            if len(self.applied) == 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   548
                return None
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   549
            return bin(self.applied[-1].rev)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   550
        pp = repo.changelog.parents(rev)
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   551
        if pp[1] != nullid:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
   552
            arevs = [x.rev for x in self.applied]
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   553
            p0 = hex(pp[0])
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   554
            p1 = hex(pp[1])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   555
            if p0 in arevs:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   556
                return pp[0]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   557
            if p1 in arevs:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   558
                return pp[1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   559
        return pp[0]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   560
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
   561
    def mergepatch(self, repo, mergeq, series, diffopts):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   562
        if len(self.applied) == 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   563
            # each of the patches merged in will have two parents.  This
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   564
            # can confuse the qrefresh, qdiff, and strip code because it
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   565
            # needs to know which parent is actually in the patch queue.
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   566
            # so, we insert a merge marker with only one parent.  This way
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   567
            # the first patch in the queue is never a merge patch
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   568
            #
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   569
            pname = ".hg.patches.merge.marker"
8706
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8700
diff changeset
   570
            n = repo.commit('[mq]: merge marker', force=True)
4207
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4206
diff changeset
   571
            self.removeundo(repo)
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   572
            self.applied.append(statusentry(hex(n), pname))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   573
            self.applied_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   574
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   575
        head = self.qparents(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   576
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   577
        for patch in series:
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   578
            patch = mergeq.lookup(patch, strict=True)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   579
            if not patch:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
   580
                self.ui.warn(_("patch %s does not exist\n") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   581
                return (1, None)
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   582
            pushable, reason = self.pushable(patch)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   583
            if not pushable:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   584
                self.explain_pushable(patch, all_patches=True)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   585
                continue
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   586
            info = mergeq.isapplied(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   587
            if not info:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
   588
                self.ui.warn(_("patch %s is not applied\n") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   589
                return (1, None)
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   590
            rev = bin(info[1])
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
   591
            err, head = self.mergeone(repo, mergeq, head, patch, rev, diffopts)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   592
            if head:
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   593
                self.applied.append(statusentry(hex(head), patch))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   594
                self.applied_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   595
            if err:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   596
                return (err, head)
4437
a210b40d0860 Make mergepatch save queue now that qpush isn't.
Brendan Cully <brendan@kublai.com>
parents: 4432
diff changeset
   597
        self.save_dirty()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   598
        return (0, head)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   599
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   600
    def patch(self, repo, patchfile):
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   601
        '''Apply patchfile  to the working directory.
8761
0289f384e1e5 Generally replace "file name" with "filename" in help and comments.
timeless <timeless@gmail.com>
parents: 8760
diff changeset
   602
        patchfile: name of patch file'''
3465
2d35a8d2b32d patch: return list of modified files even when an exception is raised
Brendan Cully <brendan@kublai.com>
parents: 3375
diff changeset
   603
        files = {}
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   604
        try:
3465
2d35a8d2b32d patch: return list of modified files even when an exception is raised
Brendan Cully <brendan@kublai.com>
parents: 3375
diff changeset
   605
            fuzz = patch.patch(patchfile, self.ui, strip=1, cwd=repo.root,
8811
8b35b08724eb Make mq, record and transplant honor patch.eol
Patrick Mezard <pmezard@gmail.com>
parents: 8795
diff changeset
   606
                               files=files, eolmode=None)
2919
b70740aefa4d Unify mq and hg patch invocation.
Brendan Cully <brendan@kublai.com>
parents: 2905
diff changeset
   607
        except Exception, inst:
b70740aefa4d Unify mq and hg patch invocation.
Brendan Cully <brendan@kublai.com>
parents: 2905
diff changeset
   608
            self.ui.note(str(inst) + '\n')
b70740aefa4d Unify mq and hg patch invocation.
Brendan Cully <brendan@kublai.com>
parents: 2905
diff changeset
   609
            if not self.ui.verbose:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
   610
                self.ui.warn(_("patch failed, unable to continue (try -v)\n"))
3465
2d35a8d2b32d patch: return list of modified files even when an exception is raised
Brendan Cully <brendan@kublai.com>
parents: 3375
diff changeset
   611
            return (False, files, False)
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   612
2934
2f190e998eb3 Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents: 2922
diff changeset
   613
        return (True, files, fuzz)
2796
4c39568007f9 mq: codingstyle
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2795
diff changeset
   614
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   615
    def apply(self, repo, series, list=False, update_status=True,
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
   616
              strict=False, patchdir=None, merge=None, all_files={}):
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
   617
        wlock = lock = tr = None
4418
0532491f7476 MQ: tidy up if a qpush is interrupted.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4406
diff changeset
   618
        try:
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
   619
            wlock = repo.wlock()
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   620
            lock = repo.lock()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   621
            tr = repo.transaction()
4418
0532491f7476 MQ: tidy up if a qpush is interrupted.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4406
diff changeset
   622
            try:
4970
30d4d8985dd8 transactions: avoid late tear-down (issue641)
Matt Mackall <mpm@selenic.com>
parents: 4917
diff changeset
   623
                ret = self._apply(repo, series, list, update_status,
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
   624
                                  strict, patchdir, merge, all_files=all_files)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   625
                tr.close()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   626
                self.save_dirty()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   627
                return ret
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   628
            except:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   629
                try:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   630
                    tr.abort()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   631
                finally:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   632
                    repo.invalidate()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   633
                    repo.dirstate.invalidate()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   634
                raise
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   635
        finally:
8112
6ee71f78497c switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8076
diff changeset
   636
            del tr
6ee71f78497c switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8076
diff changeset
   637
            release(lock, wlock)
5527
0b3f910dfd17 mq: really remove undo after a qpush (and after a strip)
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5432
diff changeset
   638
            self.removeundo(repo)
4418
0532491f7476 MQ: tidy up if a qpush is interrupted.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4406
diff changeset
   639
4970
30d4d8985dd8 transactions: avoid late tear-down (issue641)
Matt Mackall <mpm@selenic.com>
parents: 4917
diff changeset
   640
    def _apply(self, repo, series, list=False, update_status=True,
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
   641
               strict=False, patchdir=None, merge=None, all_files={}):
8875
801cacf46e62 mq: fix error message for qpush inexistent-patch (issue1702)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8833
diff changeset
   642
        '''returns (error, hash)
801cacf46e62 mq: fix error message for qpush inexistent-patch (issue1702)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8833
diff changeset
   643
        error = 1 for unable to read, 2 for patch failed, 3 for patch fuzz'''
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   644
        # TODO unify with commands.py
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   645
        if not patchdir:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   646
            patchdir = self.path
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   647
        err = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   648
        n = None
2934
2f190e998eb3 Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents: 2922
diff changeset
   649
        for patchname in series:
2f190e998eb3 Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents: 2922
diff changeset
   650
            pushable, reason = self.pushable(patchname)
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   651
            if not pushable:
2934
2f190e998eb3 Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents: 2922
diff changeset
   652
                self.explain_pushable(patchname, all_patches=True)
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   653
                continue
9111
ac3f1e6696eb mq: use ui.status when pushing and popping patches
Martin Geisler <mg@lazybytes.net>
parents: 9110
diff changeset
   654
            self.ui.status(_("applying %s\n") % patchname)
2934
2f190e998eb3 Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents: 2922
diff changeset
   655
            pf = os.path.join(patchdir, patchname)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   656
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   657
            try:
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   658
                ph = patchheader(self.join(patchname), self.plainmode)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   659
            except:
8875
801cacf46e62 mq: fix error message for qpush inexistent-patch (issue1702)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8833
diff changeset
   660
                self.ui.warn(_("unable to read %s\n") % patchname)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   661
                err = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   662
                break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   663
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   664
            message = ph.message
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   665
            if not message:
10274
04207f5e7344 mq: Do not translate import message that are appended to commits.
David Soria Parra <dsp@php.net>
parents: 10263
diff changeset
   666
                message = "imported patch %s\n" % patchname
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   667
            else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   668
                if list:
10274
04207f5e7344 mq: Do not translate import message that are appended to commits.
David Soria Parra <dsp@php.net>
parents: 10263
diff changeset
   669
                    message.append("\nimported patch %s" % patchname)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   670
                message = '\n'.join(message)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   671
7782
140429276b63 mq: handle empty patches more gracefully (issue1501)
Matt Mackall <mpm@selenic.com>
parents: 7772
diff changeset
   672
            if ph.haspatch:
140429276b63 mq: handle empty patches more gracefully (issue1501)
Matt Mackall <mpm@selenic.com>
parents: 7772
diff changeset
   673
                (patcherr, files, fuzz) = self.patch(repo, pf)
140429276b63 mq: handle empty patches more gracefully (issue1501)
Matt Mackall <mpm@selenic.com>
parents: 7772
diff changeset
   674
                all_files.update(files)
140429276b63 mq: handle empty patches more gracefully (issue1501)
Matt Mackall <mpm@selenic.com>
parents: 7772
diff changeset
   675
                patcherr = not patcherr
140429276b63 mq: handle empty patches more gracefully (issue1501)
Matt Mackall <mpm@selenic.com>
parents: 7772
diff changeset
   676
            else:
140429276b63 mq: handle empty patches more gracefully (issue1501)
Matt Mackall <mpm@selenic.com>
parents: 7772
diff changeset
   677
                self.ui.warn(_("patch %s is empty\n") % patchname)
140429276b63 mq: handle empty patches more gracefully (issue1501)
Matt Mackall <mpm@selenic.com>
parents: 7772
diff changeset
   678
                patcherr, files, fuzz = 0, [], 0
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   679
2934
2f190e998eb3 Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents: 2922
diff changeset
   680
            if merge and files:
4332
4e5e1638b165 mq: don't abort when merging a patch that removes files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4242
diff changeset
   681
                # Mark as removed/merged and update dirstate parent info
4e5e1638b165 mq: don't abort when merging a patch that removes files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4242
diff changeset
   682
                removed = []
4e5e1638b165 mq: don't abort when merging a patch that removes files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4242
diff changeset
   683
                merged = []
4e5e1638b165 mq: don't abort when merging a patch that removes files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4242
diff changeset
   684
                for f in files:
4905
fc61495ea9cf dirstate: make wjoin function private
Matt Mackall <mpm@selenic.com>
parents: 4904
diff changeset
   685
                    if os.path.exists(repo.wjoin(f)):
4332
4e5e1638b165 mq: don't abort when merging a patch that removes files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4242
diff changeset
   686
                        merged.append(f)
4e5e1638b165 mq: don't abort when merging a patch that removes files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4242
diff changeset
   687
                    else:
4e5e1638b165 mq: don't abort when merging a patch that removes files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4242
diff changeset
   688
                        removed.append(f)
4904
6fd953d5faea dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents: 4890
diff changeset
   689
                for f in removed:
6fd953d5faea dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents: 4890
diff changeset
   690
                    repo.dirstate.remove(f)
6fd953d5faea dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents: 4890
diff changeset
   691
                for f in merged:
6fd953d5faea dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents: 4890
diff changeset
   692
                    repo.dirstate.merge(f)
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   693
                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
   694
                repo.dirstate.setparents(p1, merge)
6603
41eb20cc1c02 match: remove files arg from repo.status and friends
Matt Mackall <mpm@selenic.com>
parents: 6602
diff changeset
   695
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
   696
            files = patch.updatedir(self.ui, repo, files)
6603
41eb20cc1c02 match: remove files arg from repo.status and friends
Matt Mackall <mpm@selenic.com>
parents: 6602
diff changeset
   697
            match = cmdutil.matchfiles(repo, files or [])
8706
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8700
diff changeset
   698
            n = repo.commit(message, ph.user, ph.date, match=match, force=True)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   699
8527
f9a80054dd3c use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents: 8525
diff changeset
   700
            if n is None:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
   701
                raise util.Abort(_("repo commit failed"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   702
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   703
            if update_status:
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   704
                self.applied.append(statusentry(hex(n), patchname))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   705
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   706
            if patcherr:
7782
140429276b63 mq: handle empty patches more gracefully (issue1501)
Matt Mackall <mpm@selenic.com>
parents: 7772
diff changeset
   707
                self.ui.warn(_("patch failed, rejects left in working dir\n"))
8875
801cacf46e62 mq: fix error message for qpush inexistent-patch (issue1702)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8833
diff changeset
   708
                err = 2
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   709
                break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   710
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   711
            if fuzz and strict:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
   712
                self.ui.warn(_("fuzz found when applying patch, stopping\n"))
8875
801cacf46e62 mq: fix error message for qpush inexistent-patch (issue1702)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8833
diff changeset
   713
                err = 3
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   714
                break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   715
        return (err, n)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   716
8833
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   717
    def _cleanup(self, patches, numrevs, keep=False):
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   718
        if not keep:
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   719
            r = self.qrepo()
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   720
            if r:
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   721
                r.remove(patches, True)
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   722
            else:
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   723
                for p in patches:
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   724
                    os.unlink(self.join(p))
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   725
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   726
        if numrevs:
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   727
            del self.applied[:numrevs]
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   728
            self.applied_dirty = 1
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   729
8209
a1a5a57efe90 replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents: 8188
diff changeset
   730
        for i in sorted([self.find_series(p) for p in patches], reverse=True):
6645
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
   731
            del self.full_series[i]
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
   732
        self.parse_series()
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
   733
        self.series_dirty = 1
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
   734
8833
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   735
    def _revpatches(self, repo, revs):
6762
f67d1468ac50 util: add sort helper
Matt Mackall <mpm@selenic.com>
parents: 6760
diff changeset
   736
        firstrev = repo[self.applied[0].rev].rev()
6645
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
   737
        patches = []
8833
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   738
        for i, rev in enumerate(revs):
8832
6e6f5b80e056 mq: warn about finalizing patches without cset message
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8811
diff changeset
   739
6645
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
   740
            if rev < firstrev:
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
   741
                raise util.Abort(_('revision %d is not managed') % rev)
8832
6e6f5b80e056 mq: warn about finalizing patches without cset message
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8811
diff changeset
   742
6e6f5b80e056 mq: warn about finalizing patches without cset message
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8811
diff changeset
   743
            ctx = repo[rev]
8833
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   744
            base = bin(self.applied[i].rev)
8832
6e6f5b80e056 mq: warn about finalizing patches without cset message
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8811
diff changeset
   745
            if ctx.node() != base:
6e6f5b80e056 mq: warn about finalizing patches without cset message
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8811
diff changeset
   746
                msg = _('cannot delete revision %d above applied patches')
6e6f5b80e056 mq: warn about finalizing patches without cset message
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8811
diff changeset
   747
                raise util.Abort(msg % rev)
6e6f5b80e056 mq: warn about finalizing patches without cset message
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8811
diff changeset
   748
8833
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   749
            patch = self.applied[i].name
8832
6e6f5b80e056 mq: warn about finalizing patches without cset message
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8811
diff changeset
   750
            for fmt in ('[mq]: %s', 'imported patch %s'):
6e6f5b80e056 mq: warn about finalizing patches without cset message
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8811
diff changeset
   751
                if ctx.description() == fmt % patch:
6e6f5b80e056 mq: warn about finalizing patches without cset message
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8811
diff changeset
   752
                    msg = _('patch %s finalized without changeset message\n')
6e6f5b80e056 mq: warn about finalizing patches without cset message
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8811
diff changeset
   753
                    repo.ui.status(msg % patch)
6e6f5b80e056 mq: warn about finalizing patches without cset message
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8811
diff changeset
   754
                    break
6e6f5b80e056 mq: warn about finalizing patches without cset message
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8811
diff changeset
   755
8833
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   756
            patches.append(patch)
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   757
        return patches
6645
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
   758
8833
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   759
    def finish(self, repo, revs):
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   760
        patches = self._revpatches(repo, sorted(revs))
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   761
        self._cleanup(patches, len(patches))
6645
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
   762
3088
dc784839516d mq: add qdelete --forget option
Brendan Cully <brendan@kublai.com>
parents: 3087
diff changeset
   763
    def delete(self, repo, patches, opts):
4736
04b2c1e27c26 mq: require patch argument or revision for qdelete
Brendan Cully <brendan@kublai.com>
parents: 4730
diff changeset
   764
        if not patches and not opts.get('rev'):
4737
2ececafa5859 mq: more qdelete help text tweaks
Brendan Cully <brendan@kublai.com>
parents: 4736
diff changeset
   765
            raise util.Abort(_('qdelete requires at least one revision or '
2ececafa5859 mq: more qdelete help text tweaks
Brendan Cully <brendan@kublai.com>
parents: 4736
diff changeset
   766
                               'patch name'))
4736
04b2c1e27c26 mq: require patch argument or revision for qdelete
Brendan Cully <brendan@kublai.com>
parents: 4730
diff changeset
   767
2905
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2904
diff changeset
   768
        realpatches = []
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2904
diff changeset
   769
        for patch in patches:
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2904
diff changeset
   770
            patch = self.lookup(patch, strict=True)
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2904
diff changeset
   771
            info = self.isapplied(patch)
3373
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   772
            if info:
2905
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2904
diff changeset
   773
                raise util.Abort(_("cannot delete applied patch %s") % patch)
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2904
diff changeset
   774
            if patch not in self.series:
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2904
diff changeset
   775
                raise util.Abort(_("patch %s not in series file") % patch)
3373
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   776
            realpatches.append(patch)
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   777
8833
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   778
        numrevs = 0
3373
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   779
        if opts.get('rev'):
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   780
            if not self.applied:
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   781
                raise util.Abort(_('no patches applied'))
3707
67f44b825784 Removed unused ui parameter from revpair/revrange and fix its users.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3700
diff changeset
   782
            revs = cmdutil.revrange(repo, opts['rev'])
3373
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   783
            if len(revs) > 1 and revs[0] > revs[1]:
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   784
                revs.reverse()
8833
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   785
            revpatches = self._revpatches(repo, revs)
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   786
            realpatches += revpatches
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   787
            numrevs = len(revpatches)
2905
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2904
diff changeset
   788
8833
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   789
        self._cleanup(realpatches, numrevs, opts.get('keep'))
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   790
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   791
    def check_toppatch(self, repo):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   792
        if len(self.applied) > 0:
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   793
            top = bin(self.applied[-1].rev)
10191
99d285ac5da4 mq: qdiff with the same diff options than qrefresh (issue1350)
Patrick Mezard <pmezard@gmail.com>
parents: 10190
diff changeset
   794
            patch = self.applied[-1].name
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   795
            pp = repo.dirstate.parents()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   796
            if top not in pp:
5432
bfbd9b954315 mq: clarify queue top message
Matt Mackall <mpm@selenic.com>
parents: 5336
diff changeset
   797
                raise util.Abort(_("working directory revision is not qtip"))
10191
99d285ac5da4 mq: qdiff with the same diff options than qrefresh (issue1350)
Patrick Mezard <pmezard@gmail.com>
parents: 10190
diff changeset
   798
            return top, patch
99d285ac5da4 mq: qdiff with the same diff options than qrefresh (issue1350)
Patrick Mezard <pmezard@gmail.com>
parents: 10190
diff changeset
   799
        return None, None
99d285ac5da4 mq: qdiff with the same diff options than qrefresh (issue1350)
Patrick Mezard <pmezard@gmail.com>
parents: 10190
diff changeset
   800
2875
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
   801
    def check_localchanges(self, repo, force=False, refresh=True):
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
   802
        m, a, r, d = repo.status()[:4]
10372
27d542bc0f5b qnew: ignore force option
Augie Fackler <durin42@gmail.com>
parents: 10370
diff changeset
   803
        if (m or a or r or d) and not force:
27d542bc0f5b qnew: ignore force option
Augie Fackler <durin42@gmail.com>
parents: 10370
diff changeset
   804
            if refresh:
27d542bc0f5b qnew: ignore force option
Augie Fackler <durin42@gmail.com>
parents: 10370
diff changeset
   805
                raise util.Abort(_("local changes found, refresh first"))
27d542bc0f5b qnew: ignore force option
Augie Fackler <durin42@gmail.com>
parents: 10370
diff changeset
   806
            else:
27d542bc0f5b qnew: ignore force option
Augie Fackler <durin42@gmail.com>
parents: 10370
diff changeset
   807
                raise util.Abort(_("local changes found"))
2875
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
   808
        return m, a, r, d
4713
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
   809
5981
ca2af0c81c9a mq: don't allow patches with some reserved names
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5980
diff changeset
   810
    _reserved = ('series', 'status', 'guards')
ca2af0c81c9a mq: don't allow patches with some reserved names
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5980
diff changeset
   811
    def check_reserved_name(self, name):
ca2af0c81c9a mq: don't allow patches with some reserved names
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5980
diff changeset
   812
        if (name in self._reserved or name.startswith('.hg')
10589
92b8c79b34c2 mq: disallow : in patch names (issue2065)
Sune Foldager <cryo@cyanite.org>
parents: 10588
diff changeset
   813
            or name.startswith('.mq') or '#' in name or ':' in name):
5981
ca2af0c81c9a mq: don't allow patches with some reserved names
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5980
diff changeset
   814
            raise util.Abort(_('"%s" cannot be used as the name of a patch')
ca2af0c81c9a mq: don't allow patches with some reserved names
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5980
diff changeset
   815
                             % name)
ca2af0c81c9a mq: don't allow patches with some reserved names
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5980
diff changeset
   816
7162
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   817
    def new(self, repo, patchfn, *pats, **opts):
7157
fd3cba5e73ae mq: do not invoke editor until just before patch creation. Closes issue1346.
Brendan Cully <brendan@kublai.com>
parents: 7142
diff changeset
   818
        """options:
fd3cba5e73ae mq: do not invoke editor until just before patch creation. Closes issue1346.
Brendan Cully <brendan@kublai.com>
parents: 7142
diff changeset
   819
           msg: a string or a no-argument function returning a string
fd3cba5e73ae mq: do not invoke editor until just before patch creation. Closes issue1346.
Brendan Cully <brendan@kublai.com>
parents: 7142
diff changeset
   820
        """
4713
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
   821
        msg = opts.get('msg')
5673
dd3ce7515f4d mq: add --currentuser and --user options to qnew and qrefresh
peter.arrenbrecht@gmail.com
parents: 5645
diff changeset
   822
        user = opts.get('user')
5788
4107e823dc2c mq: add --currentdate and --date options to qnew and qrefresh
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 5673
diff changeset
   823
        date = opts.get('date')
6139
989467e8e3a9 Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6120
diff changeset
   824
        if date:
989467e8e3a9 Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6120
diff changeset
   825
            date = util.parsedate(date)
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
   826
        diffopts = self.diffopts({'git': opts.get('git')})
7162
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   827
        self.check_reserved_name(patchfn)
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   828
        if os.path.exists(self.join(patchfn)):
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   829
            raise util.Abort(_('patch "%s" already exists') % patchfn)
4713
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
   830
        if opts.get('include') or opts.get('exclude') or pats:
6582
5acbdd3941c4 walk: remove remaining users of cmdutils.matchpats
Matt Mackall <mpm@selenic.com>
parents: 6562
diff changeset
   831
            match = cmdutil.match(repo, pats, opts)
7161
b420ef2c812b mq: abort qnew -f if any file in an explicit list cannot be read
Brendan Cully <brendan@kublai.com>
parents: 7160
diff changeset
   832
            # detect missing files in pats
b420ef2c812b mq: abort qnew -f if any file in an explicit list cannot be read
Brendan Cully <brendan@kublai.com>
parents: 7160
diff changeset
   833
            def badfn(f, msg):
b420ef2c812b mq: abort qnew -f if any file in an explicit list cannot be read
Brendan Cully <brendan@kublai.com>
parents: 7160
diff changeset
   834
                raise util.Abort('%s: %s' % (f, msg))
b420ef2c812b mq: abort qnew -f if any file in an explicit list cannot be read
Brendan Cully <brendan@kublai.com>
parents: 7160
diff changeset
   835
            match.bad = badfn
6603
41eb20cc1c02 match: remove files arg from repo.status and friends
Matt Mackall <mpm@selenic.com>
parents: 6602
diff changeset
   836
            m, a, r, d = repo.status(match=match)[:4]
4713
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
   837
        else:
10372
27d542bc0f5b qnew: ignore force option
Augie Fackler <durin42@gmail.com>
parents: 10370
diff changeset
   838
            m, a, r, d = self.check_localchanges(repo, force=True)
7297
bd6deb7525f4 mq: use cmdutil.matchfiles instead of match for qnew -f.
Brendan Cully <brendan@kublai.com>
parents: 7280
diff changeset
   839
            match = cmdutil.matchfiles(repo, m + a + r)
10372
27d542bc0f5b qnew: ignore force option
Augie Fackler <durin42@gmail.com>
parents: 10370
diff changeset
   840
        if len(repo[None].parents()) > 1:
27d542bc0f5b qnew: ignore force option
Augie Fackler <durin42@gmail.com>
parents: 10370
diff changeset
   841
            raise util.Abort(_('cannot manage merge changesets'))
2875
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
   842
        commitfiles = m + a + r
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   843
        self.check_toppatch(repo)
7162
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   844
        insert = self.full_series_end()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   845
        wlock = repo.wlock()
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   846
        try:
7162
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   847
            # if patch file write fails, abort early
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   848
            p = self.opener(patchfn, "w")
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   849
            try:
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   850
                if self.plainmode:
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   851
                    if user:
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   852
                        p.write("From: " + user + "\n")
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   853
                        if not date:
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   854
                            p.write("\n")
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   855
                    if date:
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   856
                        p.write("Date: %d %d\n\n" % date)
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   857
                else:
7162
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   858
                    p.write("# HG changeset patch\n")
10413
e433002acb05 fix up a bunch of check-code warnings
Matt Mackall <mpm@selenic.com>
parents: 10410
diff changeset
   859
                    p.write("# Parent "
e433002acb05 fix up a bunch of check-code warnings
Matt Mackall <mpm@selenic.com>
parents: 10410
diff changeset
   860
                            + hex(repo[None].parents()[0].node()) + "\n")
7162
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   861
                    if user:
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   862
                        p.write("# User " + user + "\n")
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   863
                    if date:
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   864
                        p.write("# Date %s %s\n\n" % date)
8366
0bf0045000b5 some modernization cleanups, forward compatibility
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8362
diff changeset
   865
                if hasattr(msg, '__call__'):
7162
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   866
                    msg = msg()
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   867
                commitmsg = msg and msg or ("[mq]: %s" % patchfn)
8706
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8700
diff changeset
   868
                n = repo.commit(commitmsg, user, date, match=match, force=True)
8527
f9a80054dd3c use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents: 8525
diff changeset
   869
                if n is None:
7162
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   870
                    raise util.Abort(_("repo commit failed"))
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   871
                try:
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   872
                    self.full_series[insert:insert] = [patchfn]
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   873
                    self.applied.append(statusentry(hex(n), patchfn))
7162
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   874
                    self.parse_series()
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   875
                    self.series_dirty = 1
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   876
                    self.applied_dirty = 1
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   877
                    if msg:
7614
f9fcb189c8e2 mq: make qnew patch format consistent with qrefresh (issue1457)
Bernhard Leiner <bleiner@gmail.com>
parents: 7568
diff changeset
   878
                        msg = msg + "\n\n"
7162
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   879
                        p.write(msg)
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   880
                    if commitfiles:
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   881
                        parent = self.qparents(repo, n)
7308
b6f5490effbf patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7307
diff changeset
   882
                        chunks = patch.diff(repo, node1=parent, node2=n,
b6f5490effbf patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7307
diff changeset
   883
                                            match=match, opts=diffopts)
b6f5490effbf patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7307
diff changeset
   884
                        for chunk in chunks:
b6f5490effbf patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7307
diff changeset
   885
                            p.write(chunk)
7162
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   886
                    p.close()
8112
6ee71f78497c switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8076
diff changeset
   887
                    wlock.release()
7162
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   888
                    wlock = None
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   889
                    r = self.qrepo()
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
   890
                    if r:
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
   891
                        r.add([patchfn])
7162
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   892
                except:
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   893
                    repo.rollback()
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   894
                    raise
7280
810ca383da9c remove unused variables
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7271
diff changeset
   895
            except Exception:
7162
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   896
                patchpath = self.join(patchfn)
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   897
                try:
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   898
                    os.unlink(patchpath)
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   899
                except:
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   900
                    self.ui.warn(_('error unlinking %s\n') % patchpath)
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
   901
                raise
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   902
            self.removeundo(repo)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   903
        finally:
8112
6ee71f78497c switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8076
diff changeset
   904
            release(wlock)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   905
6472
8c4cd80afd3e mq: add --force option to strip
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6382
diff changeset
   906
    def strip(self, repo, rev, update=True, backup="all", force=None):
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
   907
        wlock = lock = None
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   908
        try:
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   909
            wlock = repo.wlock()
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   910
            lock = repo.lock()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   911
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   912
            if update:
6472
8c4cd80afd3e mq: add --force option to strip
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6382
diff changeset
   913
                self.check_localchanges(repo, force=force, refresh=False)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   914
                urev = self.qparents(repo, rev)
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
   915
                hg.clean(repo, urev)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   916
                repo.dirstate.write()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   917
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   918
            self.removeundo(repo)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   919
            repair.strip(self.ui, repo, rev, backup)
5527
0b3f910dfd17 mq: really remove undo after a qpush (and after a strip)
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5432
diff changeset
   920
            # strip may have unbundled a set of backed up revisions after
0b3f910dfd17 mq: really remove undo after a qpush (and after a strip)
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5432
diff changeset
   921
            # the actual strip
0b3f910dfd17 mq: really remove undo after a qpush (and after a strip)
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5432
diff changeset
   922
            self.removeundo(repo)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   923
        finally:
8112
6ee71f78497c switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8076
diff changeset
   924
            release(lock, wlock)
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   925
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   926
    def isapplied(self, patch):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   927
        """returns (index, rev, patch)"""
8632
9e055cfdd620 replace "i in range(len(xs))" with "i, x in enumerate(xs)"
Martin Geisler <mg@lazybytes.net>
parents: 8624
diff changeset
   928
        for i, a in enumerate(self.applied):
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
   929
            if a.name == patch:
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
   930
                return (i, a.rev, a.name)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   931
        return None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   932
3223
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3186
diff changeset
   933
    # if the exact patch name does not exist, we try a few
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   934
    # variations.  If strict is passed, we try only #1
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   935
    #
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   936
    # 1) a number to indicate an offset in the series file
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   937
    # 2) a unique substring of the patch name was given
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   938
    # 3) patchname[-+]num to indicate an offset in the series file
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   939
    def lookup(self, patch, strict=False):
2844
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
   940
        patch = patch and str(patch)
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
   941
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   942
        def partial_name(s):
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   943
            if s in self.series:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   944
                return s
2765
0327bd1c831c mq: print matches if patch name not unique
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2757
diff changeset
   945
            matches = [x for x in self.series if s in x]
0327bd1c831c mq: print matches if patch name not unique
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2757
diff changeset
   946
            if len(matches) > 1:
0327bd1c831c mq: print matches if patch name not unique
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2757
diff changeset
   947
                self.ui.warn(_('patch name "%s" is ambiguous:\n') % s)
0327bd1c831c mq: print matches if patch name not unique
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2757
diff changeset
   948
                for m in matches:
0327bd1c831c mq: print matches if patch name not unique
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2757
diff changeset
   949
                    self.ui.warn('  %s\n' % m)
0327bd1c831c mq: print matches if patch name not unique
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2757
diff changeset
   950
                return None
0327bd1c831c mq: print matches if patch name not unique
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2757
diff changeset
   951
            if matches:
0327bd1c831c mq: print matches if patch name not unique
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2757
diff changeset
   952
                return matches[0]
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   953
            if len(self.series) > 0 and len(self.applied) > 0:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   954
                if s == 'qtip':
3874
e88d03c2a3d9 mq: fix qheader without args when guards are applied after qtop
Brendan Cully <brendan@kublai.com>
parents: 3871
diff changeset
   955
                    return self.series[self.series_end(True)-1]
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   956
                if s == 'qbase':
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   957
                    return self.series[0]
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   958
            return None
7568
12df451ce205 mq: don't warn about ambiguous patch name when using patch index (issue1439)
Jason Orendorff <jorendorff@mozilla.com>
parents: 7566
diff changeset
   959
8527
f9a80054dd3c use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents: 8525
diff changeset
   960
        if patch is None:
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   961
            return None
7568
12df451ce205 mq: don't warn about ambiguous patch name when using patch index (issue1439)
Jason Orendorff <jorendorff@mozilla.com>
parents: 7566
diff changeset
   962
        if patch in self.series:
12df451ce205 mq: don't warn about ambiguous patch name when using patch index (issue1439)
Jason Orendorff <jorendorff@mozilla.com>
parents: 7566
diff changeset
   963
            return patch
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   964
2819
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
   965
        if not os.path.isfile(self.join(patch)):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   966
            try:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   967
                sno = int(patch)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
   968
            except (ValueError, OverflowError):
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   969
                pass
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   970
            else:
7568
12df451ce205 mq: don't warn about ambiguous patch name when using patch index (issue1439)
Jason Orendorff <jorendorff@mozilla.com>
parents: 7566
diff changeset
   971
                if -len(self.series) <= sno < len(self.series):
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   972
                    return self.series[sno]
7568
12df451ce205 mq: don't warn about ambiguous patch name when using patch index (issue1439)
Jason Orendorff <jorendorff@mozilla.com>
parents: 7566
diff changeset
   973
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   974
            if not strict:
7568
12df451ce205 mq: don't warn about ambiguous patch name when using patch index (issue1439)
Jason Orendorff <jorendorff@mozilla.com>
parents: 7566
diff changeset
   975
                res = partial_name(patch)
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   976
                if res:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   977
                    return res
3082
bed7cb835d8d Fixed python2.3 incompatibility (rsplit) in qpush/qpop with index.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3076
diff changeset
   978
                minus = patch.rfind('-')
bed7cb835d8d Fixed python2.3 incompatibility (rsplit) in qpush/qpop with index.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3076
diff changeset
   979
                if minus >= 0:
bed7cb835d8d Fixed python2.3 incompatibility (rsplit) in qpush/qpop with index.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3076
diff changeset
   980
                    res = partial_name(patch[:minus])
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   981
                    if res:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   982
                        i = self.series.index(res)
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   983
                        try:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
   984
                            off = int(patch[minus + 1:] or 1)
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
   985
                        except (ValueError, OverflowError):
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   986
                            pass
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   987
                        else:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   988
                            if i - off >= 0:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   989
                                return self.series[i - off]
3082
bed7cb835d8d Fixed python2.3 incompatibility (rsplit) in qpush/qpop with index.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3076
diff changeset
   990
                plus = patch.rfind('+')
bed7cb835d8d Fixed python2.3 incompatibility (rsplit) in qpush/qpop with index.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3076
diff changeset
   991
                if plus >= 0:
bed7cb835d8d Fixed python2.3 incompatibility (rsplit) in qpush/qpop with index.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3076
diff changeset
   992
                    res = partial_name(patch[:plus])
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   993
                    if res:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   994
                        i = self.series.index(res)
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   995
                        try:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
   996
                            off = int(patch[plus + 1:] or 1)
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
   997
                        except (ValueError, OverflowError):
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   998
                            pass
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   999
                        else:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1000
                            if i + off < len(self.series):
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1001
                                return self.series[i + off]
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
  1002
        raise util.Abort(_("patch %s not in series") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1003
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1004
    def push(self, repo, patch=None, force=False, list=False,
7398
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1005
             mergeq=None, all=False):
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
  1006
        diffopts = self.diffopts()
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
  1007
        wlock = repo.wlock()
8795
51c29aec0b75 mq: eliminate warning on qpush with empty series
Adrian Buehlmann <adrian@cadifra.com>
parents: 8778
diff changeset
  1008
        try:
10362
2e3ec7ef5349 mq: don't warn on qpush against a branch head
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10361
diff changeset
  1009
            heads = []
2e3ec7ef5349 mq: don't warn on qpush against a branch head
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10361
diff changeset
  1010
            for b, ls in repo.branchmap().iteritems():
2e3ec7ef5349 mq: don't warn on qpush against a branch head
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10361
diff changeset
  1011
                heads += ls
2e3ec7ef5349 mq: don't warn on qpush against a branch head
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10361
diff changeset
  1012
            if not heads:
2e3ec7ef5349 mq: don't warn on qpush against a branch head
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10361
diff changeset
  1013
                heads = [nullid]
2e3ec7ef5349 mq: don't warn on qpush against a branch head
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10361
diff changeset
  1014
            if repo.dirstate.parents()[0] not in heads:
8795
51c29aec0b75 mq: eliminate warning on qpush with empty series
Adrian Buehlmann <adrian@cadifra.com>
parents: 8778
diff changeset
  1015
                self.ui.status(_("(working directory not at a head)\n"))
6340
949e607ac544 mq: warn when applying a patch to somewhere other than tip
Matt Mackall <mpm@selenic.com>
parents: 6217
diff changeset
  1016
8795
51c29aec0b75 mq: eliminate warning on qpush with empty series
Adrian Buehlmann <adrian@cadifra.com>
parents: 8778
diff changeset
  1017
            if not self.series:
51c29aec0b75 mq: eliminate warning on qpush with empty series
Adrian Buehlmann <adrian@cadifra.com>
parents: 8778
diff changeset
  1018
                self.ui.warn(_('no patches in series\n'))
51c29aec0b75 mq: eliminate warning on qpush with empty series
Adrian Buehlmann <adrian@cadifra.com>
parents: 8778
diff changeset
  1019
                return 0
7398
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1020
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1021
            patch = self.lookup(patch)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1022
            # Suppose our series file is: A B C and the current 'top'
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1023
            # patch is B. qpush C should be performed (moving forward)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1024
            # qpush B is a NOP (no change) qpush A is an error (can't
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1025
            # go backwards with qpush)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1026
            if patch:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1027
                info = self.isapplied(patch)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1028
                if info:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1029
                    if info[0] < len(self.applied) - 1:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1030
                        raise util.Abort(
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1031
                            _("cannot push to a previous patch: %s") % patch)
7398
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1032
                    self.ui.warn(
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1033
                        _('qpush: %s is already at the top\n') % patch)
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1034
                    return
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1035
                pushable, reason = self.pushable(patch)
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1036
                if not pushable:
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1037
                    if reason:
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1038
                        reason = _('guarded by %r') % reason
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1039
                    else:
7398
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1040
                        reason = _('no matching guards')
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1041
                    self.ui.warn(_("cannot push '%s' - %s\n") % (patch, reason))
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1042
                    return 1
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1043
            elif all:
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1044
                patch = self.series[-1]
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1045
                if self.isapplied(patch):
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1046
                    self.ui.warn(_('all patches are currently applied\n'))
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1047
                    return 0
4100
c30c922f907a Modify qpush/qpop idempotent operations to return success
Ben Thomas <bthomas@virtualiron.com>
parents: 4099
diff changeset
  1048
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1049
            # Following the above example, starting at 'top' of B:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1050
            # qpush should be performed (pushes C), but a subsequent
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1051
            # qpush without an argument is an error (nothing to
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1052
            # apply). This allows a loop of "...while hg qpush..." to
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1053
            # work as it detects an error when done
7398
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1054
            start = self.series_end()
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1055
            if start == len(self.series):
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1056
                self.ui.warn(_('patch series already fully applied\n'))
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1057
                return 1
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1058
            if not force:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1059
                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
  1060
7398
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1061
            self.applied_dirty = 1
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1062
            if start > 0:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1063
                self.check_toppatch(repo)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1064
            if not patch:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1065
                patch = self.series[start]
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1066
                end = start + 1
4418
0532491f7476 MQ: tidy up if a qpush is interrupted.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4406
diff changeset
  1067
            else:
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1068
                end = self.series.index(patch, start) + 1
8875
801cacf46e62 mq: fix error message for qpush inexistent-patch (issue1702)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8833
diff changeset
  1069
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1070
            s = self.series[start:end]
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1071
            all_files = {}
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1072
            try:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1073
                if mergeq:
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
  1074
                    ret = self.mergepatch(repo, mergeq, s, diffopts)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1075
                else:
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
  1076
                    ret = self.apply(repo, s, list, all_files=all_files)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1077
            except:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1078
                self.ui.warn(_('cleaning up working directory...'))
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1079
                node = repo.dirstate.parents()[0]
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
  1080
                hg.revert(repo, node, None)
6760
4faaa0535ea7 status: clean up all users for unknown files
Matt Mackall <mpm@selenic.com>
parents: 6750
diff changeset
  1081
                unknown = repo.status(unknown=True)[4]
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1082
                # only remove unknown files that we know we touched or
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1083
                # created while patching
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1084
                for f in unknown:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1085
                    if f in all_files:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1086
                        util.unlink(repo.wjoin(f))
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1087
                self.ui.warn(_('done\n'))
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1088
                raise
8875
801cacf46e62 mq: fix error message for qpush inexistent-patch (issue1702)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8833
diff changeset
  1089
9590
07a62819b309 mq: fix traceback for qpush inexistant-patch with no patch applied
Benoit Allard <benoit@aeteurope.nl>
parents: 9588
diff changeset
  1090
            if not self.applied:
07a62819b309 mq: fix traceback for qpush inexistant-patch with no patch applied
Benoit Allard <benoit@aeteurope.nl>
parents: 9588
diff changeset
  1091
                return ret[0]
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1092
            top = self.applied[-1].name
8875
801cacf46e62 mq: fix error message for qpush inexistent-patch (issue1702)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8833
diff changeset
  1093
            if ret[0] and ret[0] > 1:
801cacf46e62 mq: fix error message for qpush inexistent-patch (issue1702)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8833
diff changeset
  1094
                msg = _("errors during apply, please fix and refresh %s\n")
801cacf46e62 mq: fix error message for qpush inexistent-patch (issue1702)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8833
diff changeset
  1095
                self.ui.write(msg % top)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1096
            else:
7627
fb32ae9c76e7 mq: lowercase output
Martin Geisler <mg@daimi.au.dk>
parents: 7621
diff changeset
  1097
                self.ui.write(_("now at: %s\n") % top)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1098
            return ret[0]
8875
801cacf46e62 mq: fix error message for qpush inexistent-patch (issue1702)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8833
diff changeset
  1099
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1100
        finally:
8112
6ee71f78497c switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8076
diff changeset
  1101
            wlock.release()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1102
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
  1103
    def pop(self, repo, patch=None, force=False, update=True, all=False):
5157
f6c520fd70cf mq: teach qpop about symlinks
Bryan O'Sullivan <bos@serpentine.com>
parents: 5148
diff changeset
  1104
        def getfile(f, rev, flags):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1105
            t = repo.file(f).read(rev)
5157
f6c520fd70cf mq: teach qpop about symlinks
Bryan O'Sullivan <bos@serpentine.com>
parents: 5148
diff changeset
  1106
            repo.wwrite(f, t, flags)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1107
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
  1108
        wlock = repo.wlock()
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1109
        try:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1110
            if patch:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1111
                # index, rev, patch
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1112
                info = self.isapplied(patch)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1113
                if not info:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1114
                    patch = self.lookup(patch)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1115
                info = self.isapplied(patch)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1116
                if not info:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1117
                    raise util.Abort(_("patch %s is not applied") % patch)
4100
c30c922f907a Modify qpush/qpop idempotent operations to return success
Ben Thomas <bthomas@virtualiron.com>
parents: 4099
diff changeset
  1118
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1119
            if len(self.applied) == 0:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1120
                # Allow qpop -a to work repeatedly,
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1121
                # but not qpop without an argument
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1122
                self.ui.warn(_("no patches applied\n"))
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1123
                return not all
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1124
7620
fbfd92d51540 mq: refactor the pop code to be more readable and allow more changes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7619
diff changeset
  1125
            if all:
fbfd92d51540 mq: refactor the pop code to be more readable and allow more changes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7619
diff changeset
  1126
                start = 0
fbfd92d51540 mq: refactor the pop code to be more readable and allow more changes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7619
diff changeset
  1127
            elif patch:
fbfd92d51540 mq: refactor the pop code to be more readable and allow more changes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7619
diff changeset
  1128
                start = info[0] + 1
fbfd92d51540 mq: refactor the pop code to be more readable and allow more changes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7619
diff changeset
  1129
            else:
fbfd92d51540 mq: refactor the pop code to be more readable and allow more changes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7619
diff changeset
  1130
                start = len(self.applied) - 1
fbfd92d51540 mq: refactor the pop code to be more readable and allow more changes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7619
diff changeset
  1131
fbfd92d51540 mq: refactor the pop code to be more readable and allow more changes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7619
diff changeset
  1132
            if start >= len(self.applied):
fbfd92d51540 mq: refactor the pop code to be more readable and allow more changes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7619
diff changeset
  1133
                self.ui.warn(_("qpop: %s is already at the top\n") % patch)
fbfd92d51540 mq: refactor the pop code to be more readable and allow more changes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7619
diff changeset
  1134
                return
fbfd92d51540 mq: refactor the pop code to be more readable and allow more changes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7619
diff changeset
  1135
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1136
            if not update:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1137
                parents = repo.dirstate.parents()
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  1138
                rr = [bin(x.rev) for x in self.applied]
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1139
                for p in parents:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1140
                    if p in rr:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  1141
                        self.ui.warn(_("qpop: forcing dirstate update\n"))
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1142
                        update = True
7621
6d891df43a5f mq: allow qpop if popped revisions are not working dir parents
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7620
diff changeset
  1143
            else:
6d891df43a5f mq: allow qpop if popped revisions are not working dir parents
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7620
diff changeset
  1144
                parents = [p.hex() for p in repo[None].parents()]
6d891df43a5f mq: allow qpop if popped revisions are not working dir parents
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7620
diff changeset
  1145
                needupdate = False
6d891df43a5f mq: allow qpop if popped revisions are not working dir parents
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7620
diff changeset
  1146
                for entry in self.applied[start:]:
6d891df43a5f mq: allow qpop if popped revisions are not working dir parents
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7620
diff changeset
  1147
                    if entry.rev in parents:
6d891df43a5f mq: allow qpop if popped revisions are not working dir parents
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7620
diff changeset
  1148
                        needupdate = True
6d891df43a5f mq: allow qpop if popped revisions are not working dir parents
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7620
diff changeset
  1149
                        break
6d891df43a5f mq: allow qpop if popped revisions are not working dir parents
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7620
diff changeset
  1150
                update = needupdate
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1151
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1152
            if not force and update:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1153
                self.check_localchanges(repo)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1154
7620
fbfd92d51540 mq: refactor the pop code to be more readable and allow more changes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7619
diff changeset
  1155
            self.applied_dirty = 1
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1156
            end = len(self.applied)
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
  1157
            rev = bin(self.applied[start].rev)
5980
dcda0c90125c mq: pop/refresh: avoid losing revisions not managed by mq
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5979
diff changeset
  1158
            if update:
10191
99d285ac5da4 mq: qdiff with the same diff options than qrefresh (issue1350)
Patrick Mezard <pmezard@gmail.com>
parents: 10190
diff changeset
  1159
                top = self.check_toppatch(repo)[0]
5980
dcda0c90125c mq: pop/refresh: avoid losing revisions not managed by mq
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5979
diff changeset
  1160
7621
6d891df43a5f mq: allow qpop if popped revisions are not working dir parents
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7620
diff changeset
  1161
            try:
6d891df43a5f mq: allow qpop if popped revisions are not working dir parents
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7620
diff changeset
  1162
                heads = repo.changelog.heads(rev)
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
  1163
            except error.LookupError:
7621
6d891df43a5f mq: allow qpop if popped revisions are not working dir parents
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7620
diff changeset
  1164
                node = short(rev)
6d891df43a5f mq: allow qpop if popped revisions are not working dir parents
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7620
diff changeset
  1165
                raise util.Abort(_('trying to pop unknown node %s') % node)
6d891df43a5f mq: allow qpop if popped revisions are not working dir parents
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7620
diff changeset
  1166
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
  1167
            if heads != [bin(self.applied[-1].rev)]:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  1168
                raise util.Abort(_("popping would remove a revision not "
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  1169
                                   "managed by this patch queue"))
5980
dcda0c90125c mq: pop/refresh: avoid losing revisions not managed by mq
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5979
diff changeset
  1170
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1171
            # we know there are no local changes, so we can make a simplified
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1172
            # form of hg.update.
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1173
            if update:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1174
                qp = self.qparents(repo, rev)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1175
                changes = repo.changelog.read(qp)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1176
                mmap = repo.manifest.read(changes[0])
6760
4faaa0535ea7 status: clean up all users for unknown files
Matt Mackall <mpm@selenic.com>
parents: 6750
diff changeset
  1177
                m, a, r, d = repo.status(qp, top)[:4]
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1178
                if d:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  1179
                    raise util.Abort(_("deletions found between repo revs"))
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1180
                for f in a:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1181
                    try:
10872
9606edb8777e mq: use util.unlink instead of os.unlink and os.removedirs
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 10809
diff changeset
  1182
                        util.unlink(repo.wjoin(f))
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1183
                    except OSError, e:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1184
                        if e.errno != errno.ENOENT:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1185
                            raise
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1186
                    repo.dirstate.forget(f)
10048
46de82e50790 mq: qpop: remove added files before re-adding removed files
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9874
diff changeset
  1187
                for f in m:
46de82e50790 mq: qpop: remove added files before re-adding removed files
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9874
diff changeset
  1188
                    getfile(f, mmap[f], mmap.flags(f))
46de82e50790 mq: qpop: remove added files before re-adding removed files
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9874
diff changeset
  1189
                for f in r:
46de82e50790 mq: qpop: remove added files before re-adding removed files
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9874
diff changeset
  1190
                    getfile(f, mmap[f], mmap.flags(f))
46de82e50790 mq: qpop: remove added files before re-adding removed files
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9874
diff changeset
  1191
                for f in m + r:
46de82e50790 mq: qpop: remove added files before re-adding removed files
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9874
diff changeset
  1192
                    repo.dirstate.normal(f)
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
  1193
                repo.dirstate.setparents(qp, nullid)
9110
561ff8d9e4f0 mq: qpop now tells which patches are popped
Mads Kiilerich <mads@kiilerich.com>
parents: 9067
diff changeset
  1194
            for patch in reversed(self.applied[start:end]):
9111
ac3f1e6696eb mq: use ui.status when pushing and popping patches
Martin Geisler <mg@lazybytes.net>
parents: 9110
diff changeset
  1195
                self.ui.status(_("popping %s\n") % patch.name)
5987
f2201aee3dc8 qpop/qrefresh: update self.applied before calling strip
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5981
diff changeset
  1196
            del self.applied[start:end]
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
  1197
            self.strip(repo, rev, update=False, backup='strip')
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1198
            if len(self.applied):
7627
fb32ae9c76e7 mq: lowercase output
Martin Geisler <mg@daimi.au.dk>
parents: 7621
diff changeset
  1199
                self.ui.write(_("now at: %s\n") % self.applied[-1].name)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1200
            else:
7627
fb32ae9c76e7 mq: lowercase output
Martin Geisler <mg@daimi.au.dk>
parents: 7621
diff changeset
  1201
                self.ui.write(_("patch queue now empty\n"))
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1202
        finally:
8112
6ee71f78497c switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8076
diff changeset
  1203
            wlock.release()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1204
2937
9dc568f5e03d Fix test-mq-qdiff; add -I and -X options to qdiff
Brendan Cully <brendan@kublai.com>
parents: 2936
diff changeset
  1205
    def diff(self, repo, pats, opts):
10191
99d285ac5da4 mq: qdiff with the same diff options than qrefresh (issue1350)
Patrick Mezard <pmezard@gmail.com>
parents: 10190
diff changeset
  1206
        top, patch = self.check_toppatch(repo)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1207
        if not top:
7627
fb32ae9c76e7 mq: lowercase output
Martin Geisler <mg@daimi.au.dk>
parents: 7621
diff changeset
  1208
            self.ui.write(_("no patches applied\n"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1209
            return
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1210
        qp = self.qparents(repo, top)
9857
24bc6e414610 diff: change --inverse to --reverse
Martin Geisler <mg@lazybytes.net>
parents: 9824
diff changeset
  1211
        if opts.get('reverse'):
9725
3f522d2fa633 diff: add --inverse option
Yannick Gingras <ygingras@ygingras.net>
parents: 9642
diff changeset
  1212
            node1, node2 = None, qp
3f522d2fa633 diff: add --inverse option
Yannick Gingras <ygingras@ygingras.net>
parents: 9642
diff changeset
  1213
        else:
3f522d2fa633 diff: add --inverse option
Yannick Gingras <ygingras@ygingras.net>
parents: 9642
diff changeset
  1214
            node1, node2 = qp, None
10191
99d285ac5da4 mq: qdiff with the same diff options than qrefresh (issue1350)
Patrick Mezard <pmezard@gmail.com>
parents: 10190
diff changeset
  1215
        diffopts = self.diffopts(opts, patch)
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
  1216
        self.printdiff(repo, diffopts, node1, node2, files=pats, opts=opts)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1217
2938
5b7a118f5b6c allow qrefresh to take a list of files; closes #96.
Brendan Cully <brendan@kublai.com>
parents: 2937
diff changeset
  1218
    def refresh(self, repo, pats=None, **opts):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1219
        if len(self.applied) == 0:
7627
fb32ae9c76e7 mq: lowercase output
Martin Geisler <mg@daimi.au.dk>
parents: 7621
diff changeset
  1220
            self.ui.write(_("no patches applied\n"))
3004
ac74046f8f58 qrefresh: exit with status 1 if no patches applied.
Bryan O'Sullivan <bos@serpentine.com>
parents: 2984
diff changeset
  1221
            return 1
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
  1222
        msg = opts.get('msg', '').rstrip()
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
  1223
        newuser = opts.get('user')
6139
989467e8e3a9 Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6120
diff changeset
  1224
        newdate = opts.get('date')
989467e8e3a9 Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6120
diff changeset
  1225
        if newdate:
989467e8e3a9 Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6120
diff changeset
  1226
            newdate = '%d %d' % util.parsedate(newdate)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1227
        wlock = repo.wlock()
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1228
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1229
        try:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1230
            self.check_toppatch(repo)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1231
            (top, patchfn) = (self.applied[-1].rev, self.applied[-1].name)
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
  1232
            top = bin(top)
5980
dcda0c90125c mq: pop/refresh: avoid losing revisions not managed by mq
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5979
diff changeset
  1233
            if repo.changelog.heads(top) != [top]:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  1234
                raise util.Abort(_("cannot refresh a revision with children"))
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1235
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1236
            cparents = repo.changelog.parents(top)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1237
            patchparent = self.qparents(repo, top)
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
  1238
            ph = patchheader(self.join(patchfn), self.plainmode)
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
  1239
            diffopts = self.diffopts({'git': opts.get('git')}, patchfn)
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
  1240
            if msg:
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
  1241
                ph.setmessage(msg)
5673
dd3ce7515f4d mq: add --currentuser and --user options to qnew and qrefresh
peter.arrenbrecht@gmail.com
parents: 5645
diff changeset
  1242
            if newuser:
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
  1243
                ph.setuser(newuser)
5788
4107e823dc2c mq: add --currentdate and --date options to qnew and qrefresh
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 5673
diff changeset
  1244
            if newdate:
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
  1245
                ph.setdate(newdate)
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
  1246
            ph.setparent(hex(patchparent))
5180
5bbbd1f1d586 mq: truncate patch just before rewriting header
Brendan Cully <brendan@kublai.com>
parents: 4930
diff changeset
  1247
7400
409a9b442308 mq: use atomictempfiles during patch refresh
Brendan Cully <brendan@kublai.com>
parents: 7399
diff changeset
  1248
            # only commit new patch when write is complete
409a9b442308 mq: use atomictempfiles during patch refresh
Brendan Cully <brendan@kublai.com>
parents: 7399
diff changeset
  1249
            patchf = self.opener(patchfn, 'w', atomictemp=True)
409a9b442308 mq: use atomictempfiles during patch refresh
Brendan Cully <brendan@kublai.com>
parents: 7399
diff changeset
  1250
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
  1251
            comments = str(ph)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1252
            if comments:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1253
                patchf.write(comments)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1254
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1255
            # update the dirstate in place, strip off the qtip commit
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1256
            # and then commit.
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1257
            #
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1258
            # this should really read:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1259
            #   mm, dd, aa, aa2 = repo.status(tip, patchparent)[:4]
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1260
            # but we do it backwards to take advantage of manifest/chlog
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1261
            # caching against the next repo.status call
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1262
            mm, aa, dd, aa2 = repo.status(patchparent, top)[:4]
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1263
            changes = repo.changelog.read(top)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1264
            man = repo.manifest.read(changes[0])
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1265
            aaa = aa[:]
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1266
            matchfn = cmdutil.match(repo, pats, opts)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1267
            # in short mode, we only diff the files included in the
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1268
            # patch already plus specified files
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1269
            if opts.get('short'):
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1270
                # if amending a patch, we start with existing
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1271
                # files plus specified files - unfiltered
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1272
                match = cmdutil.matchfiles(repo, mm + aa + dd + matchfn.files())
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1273
                # filter with inc/exl options
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1274
                matchfn = cmdutil.match(repo, opts=opts)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1275
            else:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1276
                match = cmdutil.matchall(repo)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1277
            m, a, r, d = repo.status(match=match)[:4]
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1278
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1279
            # we might end up with files that were added between
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1280
            # qtip and the dirstate parent, but then changed in the
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1281
            # local dirstate. in this case, we want them to only
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1282
            # show up in the added section
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1283
            for x in m:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1284
                if x not in aa:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1285
                    mm.append(x)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1286
            # we might end up with files added by the local dirstate that
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1287
            # were deleted by the patch.  In this case, they should only
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1288
            # show up in the changed section.
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1289
            for x in a:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1290
                if x in dd:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1291
                    del dd[dd.index(x)]
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1292
                    mm.append(x)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1293
                else:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1294
                    aa.append(x)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1295
            # make sure any files deleted in the local dirstate
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1296
            # are not in the add or change column of the patch
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1297
            forget = []
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1298
            for x in d + r:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1299
                if x in aa:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1300
                    del aa[aa.index(x)]
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1301
                    forget.append(x)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1302
                    continue
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1303
                elif x in mm:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1304
                    del mm[mm.index(x)]
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1305
                dd.append(x)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1306
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1307
            m = list(set(mm))
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1308
            r = list(set(dd))
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1309
            a = list(set(aa))
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1310
            c = [filter(matchfn, l) for l in (m, a, r)]
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1311
            match = cmdutil.matchfiles(repo, set(c[0] + c[1] + c[2]))
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1312
            chunks = patch.diff(repo, patchparent, match=match,
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1313
                                changes=c, opts=diffopts)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1314
            for chunk in chunks:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1315
                patchf.write(chunk)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1316
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1317
            try:
10368
f05e0d54f424 Merge with crew-stable
Patrick Mezard <pmezard@gmail.com>
parents: 10362 10366
diff changeset
  1318
                if diffopts.git or diffopts.upgrade:
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1319
                    copies = {}
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1320
                    for dst in a:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1321
                        src = repo.dirstate.copied(dst)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1322
                        # during qfold, the source file for copies may
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1323
                        # be removed. Treat this as a simple add.
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1324
                        if src is not None and src in repo.dirstate:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1325
                            copies.setdefault(src, []).append(dst)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1326
                        repo.dirstate.add(dst)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1327
                    # remember the copies between patchparent and qtip
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1328
                    for dst in aaa:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1329
                        f = repo.file(dst)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1330
                        src = f.renamed(man[dst])
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1331
                        if src:
10368
f05e0d54f424 Merge with crew-stable
Patrick Mezard <pmezard@gmail.com>
parents: 10362 10366
diff changeset
  1332
                            copies.setdefault(src[0], []).extend(
f05e0d54f424 Merge with crew-stable
Patrick Mezard <pmezard@gmail.com>
parents: 10362 10366
diff changeset
  1333
                                copies.get(dst, []))
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1334
                            if dst in a:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1335
                                copies[src[0]].append(dst)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1336
                        # we can't copy a file created by the patch itself
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1337
                        if dst in copies:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1338
                            del copies[dst]
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1339
                    for src, dsts in copies.iteritems():
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1340
                        for dst in dsts:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1341
                            repo.dirstate.copy(src, dst)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1342
                else:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1343
                    for dst in a:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1344
                        repo.dirstate.add(dst)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1345
                    # Drop useless copy information
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1346
                    for f in list(repo.dirstate.copies()):
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1347
                        repo.dirstate.copy(None, f)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1348
                for f in r:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1349
                    repo.dirstate.remove(f)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1350
                # if the patch excludes a modified file, mark that
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1351
                # file with mtime=0 so status can see it.
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1352
                mm = []
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1353
                for i in xrange(len(m)-1, -1, -1):
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1354
                    if not matchfn(m[i]):
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1355
                        mm.append(m[i])
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1356
                        del m[i]
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1357
                for f in m:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1358
                    repo.dirstate.normal(f)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1359
                for f in mm:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1360
                    repo.dirstate.normallookup(f)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1361
                for f in forget:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1362
                    repo.dirstate.forget(f)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1363
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1364
                if not msg:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1365
                    if not ph.message:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1366
                        message = "[mq]: %s\n" % patchfn
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1367
                    else:
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1368
                        message = "\n".join(ph.message)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1369
                else:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1370
                    message = msg
2694
0fb28dbf0dc7 MQ: uniformise message and logfile option.
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2682
diff changeset
  1371
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1372
                user = ph.user or changes[1]
5673
dd3ce7515f4d mq: add --currentuser and --user options to qnew and qrefresh
peter.arrenbrecht@gmail.com
parents: 5645
diff changeset
  1373
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1374
                # assumes strip can roll itself back if interrupted
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1375
                repo.dirstate.setparents(*cparents)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1376
                self.applied.pop()
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1377
                self.applied_dirty = 1
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1378
                self.strip(repo, top, update=False,
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1379
                           backup='strip')
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1380
            except:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1381
                repo.dirstate.invalidate()
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1382
                raise
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1383
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1384
            try:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1385
                # might be nice to attempt to roll back strip after this
7400
409a9b442308 mq: use atomictempfiles during patch refresh
Brendan Cully <brendan@kublai.com>
parents: 7399
diff changeset
  1386
                patchf.rename()
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1387
                n = repo.commit(message, user, ph.date, match=match,
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1388
                                force=True)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1389
                self.applied.append(statusentry(hex(n), patchfn))
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1390
            except:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1391
                ctx = repo[cparents[0]]
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1392
                repo.dirstate.rebuild(ctx.node(), ctx.manifest())
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1393
                self.save_dirty()
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1394
                self.ui.warn(_('refresh interrupted while patch was popped! '
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1395
                               '(revert --all, qpush to recover)\n'))
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1396
                raise
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1397
        finally:
8112
6ee71f78497c switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8076
diff changeset
  1398
            wlock.release()
7401
41e87b4d0c9d mq: recover more gracefully from interrupted qrefresh (issue1216)
Brendan Cully <brendan@kublai.com>
parents: 7400
diff changeset
  1399
            self.removeundo(repo)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1400
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1401
    def init(self, repo, create=False):
4071
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1402
        if not create and os.path.isdir(self.path):
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
  1403
            raise util.Abort(_("patch queue directory already exists"))
4071
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1404
        try:
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1405
            os.mkdir(self.path)
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1406
        except OSError, inst:
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1407
            if inst.errno != errno.EEXIST or not create:
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1408
                raise
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1409
        if create:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1410
            return self.qrepo(create=True)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1411
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1412
    def unapplied(self, repo, patch=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1413
        if patch and patch not in self.series:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
  1414
            raise util.Abort(_("patch %s is not in series file") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1415
        if not patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1416
            start = self.series_end()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1417
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1418
            start = self.series.index(patch) + 1
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1419
        unapplied = []
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1420
        for i in xrange(start, len(self.series)):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1421
            pushable, reason = self.pushable(i)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1422
            if pushable:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1423
                unapplied.append((i, self.series[i]))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1424
            self.explain_pushable(i)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1425
        return unapplied
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1426
4239
417c2068cb92 Simplified qseries and hg qapplied to fix some bugs caused by optimization:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4238
diff changeset
  1427
    def qseries(self, repo, missing=None, start=0, length=None, status=None,
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1428
                summary=False):
9016
894c5b4be275 mq: align columns in verbose qseries output.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 8948
diff changeset
  1429
        def displayname(pfx, patchname):
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1430
            if summary:
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
  1431
                ph = patchheader(self.join(patchname), self.plainmode)
9874
c51494c53841 qseries: don't truncate the patch name (issue1912)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9867
diff changeset
  1432
                msg = ph.message and ph.message[0] or ''
10946
214a518a4b6e mq: toggle truncating using ui.plain() rather than ui.interactive()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10872
diff changeset
  1433
                if not self.ui.plain():
9874
c51494c53841 qseries: don't truncate the patch name (issue1912)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9867
diff changeset
  1434
                    width = util.termwidth() - len(pfx) - len(patchname) - 2
c51494c53841 qseries: don't truncate the patch name (issue1912)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9867
diff changeset
  1435
                    if width > 0:
c51494c53841 qseries: don't truncate the patch name (issue1912)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9867
diff changeset
  1436
                        msg = util.ellipsis(msg, width)
c51494c53841 qseries: don't truncate the patch name (issue1912)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9867
diff changeset
  1437
                    else:
c51494c53841 qseries: don't truncate the patch name (issue1912)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9867
diff changeset
  1438
                        msg = ''
c51494c53841 qseries: don't truncate the patch name (issue1912)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9867
diff changeset
  1439
                msg = "%s%s: %s" % (pfx, patchname, msg)
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1440
            else:
9874
c51494c53841 qseries: don't truncate the patch name (issue1912)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9867
diff changeset
  1441
                msg = pfx + patchname
9016
894c5b4be275 mq: align columns in verbose qseries output.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 8948
diff changeset
  1442
            self.ui.write(msg + '\n')
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1443
8152
08e1baf924ca replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents: 8151
diff changeset
  1444
        applied = set([p.name for p in self.applied])
4239
417c2068cb92 Simplified qseries and hg qapplied to fix some bugs caused by optimization:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4238
diff changeset
  1445
        if length is None:
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1446
            length = len(self.series) - start
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1447
        if not missing:
9016
894c5b4be275 mq: align columns in verbose qseries output.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 8948
diff changeset
  1448
            if self.ui.verbose:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  1449
                idxwidth = len(str(start + length - 1))
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  1450
            for i in xrange(start, start + length):
4239
417c2068cb92 Simplified qseries and hg qapplied to fix some bugs caused by optimization:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4238
diff changeset
  1451
                patch = self.series[i]
417c2068cb92 Simplified qseries and hg qapplied to fix some bugs caused by optimization:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4238
diff changeset
  1452
                if patch in applied:
417c2068cb92 Simplified qseries and hg qapplied to fix some bugs caused by optimization:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4238
diff changeset
  1453
                    stat = 'A'
417c2068cb92 Simplified qseries and hg qapplied to fix some bugs caused by optimization:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4238
diff changeset
  1454
                elif self.pushable(i)[0]:
417c2068cb92 Simplified qseries and hg qapplied to fix some bugs caused by optimization:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4238
diff changeset
  1455
                    stat = 'U'
417c2068cb92 Simplified qseries and hg qapplied to fix some bugs caused by optimization:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4238
diff changeset
  1456
                else:
417c2068cb92 Simplified qseries and hg qapplied to fix some bugs caused by optimization:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4238
diff changeset
  1457
                    stat = 'G'
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1458
                pfx = ''
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1459
                if self.ui.verbose:
9016
894c5b4be275 mq: align columns in verbose qseries output.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 8948
diff changeset
  1460
                    pfx = '%*d %s ' % (idxwidth, i, stat)
4239
417c2068cb92 Simplified qseries and hg qapplied to fix some bugs caused by optimization:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4238
diff changeset
  1461
                elif status and status != stat:
4238
ce6c364ebb2a Fix issue443: inconsistent output of "hg qunapplied -v"
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4173
diff changeset
  1462
                    continue
9016
894c5b4be275 mq: align columns in verbose qseries output.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 8948
diff changeset
  1463
                displayname(pfx, patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1464
        else:
2794
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
  1465
            msng_list = []
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1466
            for root, dirs, files in os.walk(self.path):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1467
                d = root[len(self.path) + 1:]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1468
                for f in files:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1469
                    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
  1470
                    if (fl not in self.series and
4241
7c59ade0f0d6 hg qseries -m: guards file was not ignored
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4239
diff changeset
  1471
                        fl not in (self.status_path, self.series_path,
7c59ade0f0d6 hg qseries -m: guards file was not ignored
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4239
diff changeset
  1472
                                   self.guards_path)
1852
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
  1473
                        and not fl.startswith('.')):
2794
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
  1474
                        msng_list.append(fl)
8209
a1a5a57efe90 replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents: 8188
diff changeset
  1475
            for x in sorted(msng_list):
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1476
                pfx = self.ui.verbose and ('D ') or ''
9016
894c5b4be275 mq: align columns in verbose qseries output.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 8948
diff changeset
  1477
                displayname(pfx, x)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1478
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1479
    def issaveline(self, l):
2816
52516e48e3f3 Update qsave to use StatusEntry; don't throw exception on bad status lines.
Brendan Cully <brendan@kublai.com>
parents: 2804
diff changeset
  1480
        if l.name == '.hg.patches.save.line':
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1481
            return True
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1482
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1483
    def qrepo(self, create=False):
2819
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
  1484
        if create or os.path.isdir(self.join(".hg")):
1839
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1810
diff changeset
  1485
            return hg.repository(self.ui, path=self.path, create=create)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1486
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1487
    def restore(self, repo, rev, delete=None, qupdate=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1488
        c = repo.changelog.read(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1489
        desc = c[4].strip()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1490
        lines = desc.splitlines()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1491
        i = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1492
        datastart = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1493
        series = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1494
        applied = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1495
        qpp = None
8632
9e055cfdd620 replace "i in range(len(xs))" with "i, x in enumerate(xs)"
Martin Geisler <mg@lazybytes.net>
parents: 8624
diff changeset
  1496
        for i, line in enumerate(lines):
9e055cfdd620 replace "i in range(len(xs))" with "i, x in enumerate(xs)"
Martin Geisler <mg@lazybytes.net>
parents: 8624
diff changeset
  1497
            if line == 'Patch Data:':
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1498
                datastart = i + 1
8632
9e055cfdd620 replace "i in range(len(xs))" with "i, x in enumerate(xs)"
Martin Geisler <mg@lazybytes.net>
parents: 8624
diff changeset
  1499
            elif line.startswith('Dirstate:'):
9e055cfdd620 replace "i in range(len(xs))" with "i, x in enumerate(xs)"
Martin Geisler <mg@lazybytes.net>
parents: 8624
diff changeset
  1500
                l = line.rstrip()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1501
                l = l[10:].split(' ')
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  1502
                qpp = [bin(x) for x in l]
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1503
            elif datastart != None:
8632
9e055cfdd620 replace "i in range(len(xs))" with "i, x in enumerate(xs)"
Martin Geisler <mg@lazybytes.net>
parents: 8624
diff changeset
  1504
                l = line.rstrip()
2818
bdc067ff6cf5 Make mq camelcase consistent with the rest of hg.
Brendan Cully <brendan@kublai.com>
parents: 2816
diff changeset
  1505
                se = statusentry(l)
2794
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
  1506
                file_ = se.name
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
  1507
                if se.rev:
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
  1508
                    applied.append(se)
3185
b3e103c388fc mq: don't write applied patches into series twice in restore
Brendan Cully <brendan@kublai.com>
parents: 3184
diff changeset
  1509
                else:
b3e103c388fc mq: don't write applied patches into series twice in restore
Brendan Cully <brendan@kublai.com>
parents: 3184
diff changeset
  1510
                    series.append(file_)
8527
f9a80054dd3c use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents: 8525
diff changeset
  1511
        if datastart is None:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  1512
            self.ui.warn(_("No saved patch data found\n"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1513
            return 1
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  1514
        self.ui.warn(_("restoring status: %s\n") % lines[0])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1515
        self.full_series = series
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1516
        self.applied = applied
2767
60683ab1ed33 mq: rename read_series as parse_series, make simpler and faster
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2766
diff changeset
  1517
        self.parse_series()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1518
        self.series_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1519
        self.applied_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1520
        heads = repo.changelog.heads()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1521
        if delete:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1522
            if rev not in heads:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  1523
                self.ui.warn(_("save entry has children, leaving it alone\n"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1524
            else:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  1525
                self.ui.warn(_("removing save entry %s\n") % short(rev))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1526
                pp = repo.dirstate.parents()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1527
                if rev in pp:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1528
                    update = True
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1529
                else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1530
                    update = False
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1531
                self.strip(repo, rev, update=update, backup='strip')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1532
        if qpp:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  1533
            self.ui.warn(_("saved queue repository parents: %s %s\n") %
6217
fe8dbbe9520d Avoid importing mercurial.node/mercurial.repo stuff from mercurial.hg
Joel Rosdahl <joel@rosdahl.net>
parents: 6195
diff changeset
  1534
                         (short(qpp[0]), short(qpp[1])))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1535
            if qupdate:
5878
d39af2eabb8c transform a bunch of print statements to appropriate ui calls
Matt Mackall <mpm@selenic.com>
parents: 5788
diff changeset
  1536
                self.ui.status(_("queue directory updating\n"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1537
                r = self.qrepo()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1538
                if not r:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  1539
                    self.ui.warn(_("Unable to load queue repository\n"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1540
                    return 1
2808
30f59f4a327e Introduce update helper functions: update, merge, clean, and revert
Matt Mackall <mpm@selenic.com>
parents: 2804
diff changeset
  1541
                hg.clean(r, qpp[0])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1542
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1543
    def save(self, repo, msg=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1544
        if len(self.applied) == 0:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  1545
            self.ui.warn(_("save: no patches applied, exiting\n"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1546
            return 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1547
        if self.issaveline(self.applied[-1]):
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  1548
            self.ui.warn(_("status is already saved\n"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1549
            return 1
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1550
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  1551
        ar = [':' + x for x in self.full_series]
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1552
        if not msg:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  1553
            msg = _("hg patches saved state")
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1554
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1555
            msg = "hg patches: " + msg.rstrip('\r\n')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1556
        r = self.qrepo()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1557
        if r:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1558
            pp = r.dirstate.parents()
6217
fe8dbbe9520d Avoid importing mercurial.node/mercurial.repo stuff from mercurial.hg
Joel Rosdahl <joel@rosdahl.net>
parents: 6195
diff changeset
  1559
            msg += "\nDirstate: %s %s" % (hex(pp[0]), hex(pp[1]))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1560
        msg += "\n\nPatch Data:\n"
2816
52516e48e3f3 Update qsave to use StatusEntry; don't throw exception on bad status lines.
Brendan Cully <brendan@kublai.com>
parents: 2804
diff changeset
  1561
        text = msg + "\n".join([str(x) for x in self.applied]) + '\n' + (ar and
52516e48e3f3 Update qsave to use StatusEntry; don't throw exception on bad status lines.
Brendan Cully <brendan@kublai.com>
parents: 2804
diff changeset
  1562
                   "\n".join(ar) + '\n' or "")
8706
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8700
diff changeset
  1563
        n = repo.commit(text, force=True)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1564
        if not n:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  1565
            self.ui.warn(_("repo commit failed\n"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1566
            return 1
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
  1567
        self.applied.append(statusentry(hex(n),'.hg.patches.save.line'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1568
        self.applied_dirty = 1
4209
dbc3846c09a1 Merge with -stable, fix small test failure
Matt Mackall <mpm@selenic.com>
parents: 4207
diff changeset
  1569
        self.removeundo(repo)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1570
2698
c1123e83c8e2 mq: fix qnew and qimport to deal with series file comments
Chris Mason <mason@suse.com>
parents: 2697
diff changeset
  1571
    def full_series_end(self):
c1123e83c8e2 mq: fix qnew and qimport to deal with series file comments
Chris Mason <mason@suse.com>
parents: 2697
diff changeset
  1572
        if len(self.applied) > 0:
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
  1573
            p = self.applied[-1].name
2698
c1123e83c8e2 mq: fix qnew and qimport to deal with series file comments
Chris Mason <mason@suse.com>
parents: 2697
diff changeset
  1574
            end = self.find_series(p)
8527
f9a80054dd3c use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents: 8525
diff changeset
  1575
            if end is None:
2698
c1123e83c8e2 mq: fix qnew and qimport to deal with series file comments
Chris Mason <mason@suse.com>
parents: 2697
diff changeset
  1576
                return len(self.full_series)
c1123e83c8e2 mq: fix qnew and qimport to deal with series file comments
Chris Mason <mason@suse.com>
parents: 2697
diff changeset
  1577
            return end + 1
c1123e83c8e2 mq: fix qnew and qimport to deal with series file comments
Chris Mason <mason@suse.com>
parents: 2697
diff changeset
  1578
        return 0
c1123e83c8e2 mq: fix qnew and qimport to deal with series file comments
Chris Mason <mason@suse.com>
parents: 2697
diff changeset
  1579
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1580
    def series_end(self, all_patches=False):
4406
f700ea2b0689 mq: fix qtop failure when the series ends with guarded patches.
Patrick Mezard <pmezard@gmail.com>
parents: 4341
diff changeset
  1581
        """If all_patches is False, return the index of the next pushable patch
f700ea2b0689 mq: fix qtop failure when the series ends with guarded patches.
Patrick Mezard <pmezard@gmail.com>
parents: 4341
diff changeset
  1582
        in the series, or the series length. If all_patches is True, return the
f700ea2b0689 mq: fix qtop failure when the series ends with guarded patches.
Patrick Mezard <pmezard@gmail.com>
parents: 4341
diff changeset
  1583
        index of the first patch past the last applied one.
f700ea2b0689 mq: fix qtop failure when the series ends with guarded patches.
Patrick Mezard <pmezard@gmail.com>
parents: 4341
diff changeset
  1584
        """
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1585
        end = 0
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1586
        def next(start):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1587
            if all_patches:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1588
                return start
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1589
            i = start
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1590
            while i < len(self.series):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1591
                p, reason = self.pushable(i)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1592
                if p:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1593
                    break
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1594
                self.explain_pushable(i)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1595
                i += 1
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1596
            return i
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1597
        if len(self.applied) > 0:
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
  1598
            p = self.applied[-1].name
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1599
            try:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1600
                end = self.series.index(p)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1601
            except ValueError:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1602
                return 0
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1603
            return next(end + 1)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1604
        return next(end)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1605
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1606
    def appliedname(self, index):
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
  1607
        pname = self.applied[index].name
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1608
        if not self.ui.verbose:
2677
ec05ce9cbf47 mq: uniform verbose display of patche[s].
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2664
diff changeset
  1609
            p = pname
ec05ce9cbf47 mq: uniform verbose display of patche[s].
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2664
diff changeset
  1610
        else:
2941
d32df6452323 mq: fix appliedname
Brendan Cully <brendan@kublai.com>
parents: 2940
diff changeset
  1611
            p = str(self.series.index(pname)) + " " + pname
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1612
        return p
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1613
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1614
    def qimport(self, repo, files, patchname=None, rev=None, existing=None,
3691
79151c94c3b4 mq: add --git option to qimport -r
Brendan Cully <brendan@kublai.com>
parents: 3685
diff changeset
  1615
                force=None, git=False):
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1616
        def checkseries(patchname):
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1617
            if patchname in self.series:
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1618
                raise util.Abort(_('patch %s is already in the series file')
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1619
                                 % patchname)
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1620
        def checkfile(patchname):
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1621
            if not force and os.path.exists(self.join(patchname)):
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1622
                raise util.Abort(_('patch "%s" already exists')
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1623
                                 % patchname)
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1624
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1625
        if rev:
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1626
            if files:
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1627
                raise util.Abort(_('option "-r" not valid when importing '
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1628
                                   'files'))
3707
67f44b825784 Removed unused ui parameter from revpair/revrange and fix its users.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3700
diff changeset
  1629
            rev = cmdutil.revrange(repo, rev)
9032
1fa80c5428b8 compat: use 'key' argument instead of 'cmp' when sorting a list
Alejandro Santos <alejolp@alejolp.com>
parents: 9016
diff changeset
  1630
            rev.sort(reverse=True)
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1631
        if (len(files) > 1 or len(rev) > 1) and patchname:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
  1632
            raise util.Abort(_('option "-n" not valid when importing multiple '
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1633
                               'patches'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1634
        i = 0
2488
2785aeb51be4 mq: add qimported patches if patch dir is a repo
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2301
diff changeset
  1635
        added = []
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1636
        if rev:
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1637
            # If mq patches are applied, we can only import revisions
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1638
            # that form a linear path to qbase.
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1639
            # Otherwise, they should form a linear path to a head.
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1640
            heads = repo.changelog.heads(repo.changelog.node(rev[-1]))
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1641
            if len(heads) > 1:
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1642
                raise util.Abort(_('revision %d is the root of more than one '
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1643
                                   'branch') % rev[-1])
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1644
            if self.applied:
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
  1645
                base = hex(repo.changelog.node(rev[0]))
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1646
                if base in [n.rev for n in self.applied]:
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1647
                    raise util.Abort(_('revision %d is already managed')
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1648
                                     % rev[0])
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
  1649
                if heads != [bin(self.applied[-1].rev)]:
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1650
                    raise util.Abort(_('revision %d is not the parent of '
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1651
                                       'the queue') % rev[0])
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
  1652
                base = repo.changelog.rev(bin(self.applied[0].rev))
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1653
                lastparent = repo.changelog.parentrevs(base)[0]
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1654
            else:
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1655
                if heads != [repo.changelog.node(rev[0])]:
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1656
                    raise util.Abort(_('revision %d has unmanaged children')
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1657
                                     % rev[0])
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1658
                lastparent = None
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1659
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
  1660
            diffopts = self.diffopts({'git': git})
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1661
            for r in rev:
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1662
                p1, p2 = repo.changelog.parentrevs(r)
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1663
                n = repo.changelog.node(r)
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
  1664
                if p2 != nullrev:
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1665
                    raise util.Abort(_('cannot import merge revision %d') % r)
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1666
                if lastparent and lastparent != r:
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1667
                    raise util.Abort(_('revision %d is not the parent of %d')
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1668
                                     % (r, lastparent))
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1669
                lastparent = p1
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1670
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1671
                if not patchname:
4037
bbdba01cce28 Enforce unixish style for all generated patch names.
Patrick Mezard <pmezard@gmail.com>
parents: 4016
diff changeset
  1672
                    patchname = normname('%d.diff' % r)
5981
ca2af0c81c9a mq: don't allow patches with some reserved names
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5980
diff changeset
  1673
                self.check_reserved_name(patchname)
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1674
                checkseries(patchname)
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1675
                checkfile(patchname)
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1676
                self.full_series.insert(0, patchname)
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1677
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1678
                patchf = self.opener(patchname, "w")
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
  1679
                patch.export(repo, [n], fp=patchf, opts=diffopts)
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1680
                patchf.close()
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1681
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
  1682
                se = statusentry(hex(n), patchname)
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1683
                self.applied.insert(0, se)
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1684
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1685
                added.append(patchname)
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1686
                patchname = None
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1687
            self.parse_series()
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1688
            self.applied_dirty = 1
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1689
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1690
        for filename in files:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1691
            if existing:
3547
891c8d20f80f mq: support qimport -
Brendan Cully <brendan@kublai.com>
parents: 3492
diff changeset
  1692
                if filename == '-':
891c8d20f80f mq: support qimport -
Brendan Cully <brendan@kublai.com>
parents: 3492
diff changeset
  1693
                    raise util.Abort(_('-e is incompatible with import from -'))
3133
15fde1970003 qimport: rename patch to patchname to avoid shadowing module
Brendan Cully <brendan@kublai.com>
parents: 3091
diff changeset
  1694
                if not patchname:
4037
bbdba01cce28 Enforce unixish style for all generated patch names.
Patrick Mezard <pmezard@gmail.com>
parents: 4016
diff changeset
  1695
                    patchname = normname(filename)
5981
ca2af0c81c9a mq: don't allow patches with some reserved names
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5980
diff changeset
  1696
                self.check_reserved_name(patchname)
3133
15fde1970003 qimport: rename patch to patchname to avoid shadowing module
Brendan Cully <brendan@kublai.com>
parents: 3091
diff changeset
  1697
                if not os.path.isfile(self.join(patchname)):
15fde1970003 qimport: rename patch to patchname to avoid shadowing module
Brendan Cully <brendan@kublai.com>
parents: 3091
diff changeset
  1698
                    raise util.Abort(_("patch %s does not exist") % patchname)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1699
            else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1700
                try:
3547
891c8d20f80f mq: support qimport -
Brendan Cully <brendan@kublai.com>
parents: 3492
diff changeset
  1701
                    if filename == '-':
891c8d20f80f mq: support qimport -
Brendan Cully <brendan@kublai.com>
parents: 3492
diff changeset
  1702
                        if not patchname:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  1703
                            raise util.Abort(
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  1704
                                _('need --name to import a patch from -'))
3547
891c8d20f80f mq: support qimport -
Brendan Cully <brendan@kublai.com>
parents: 3492
diff changeset
  1705
                        text = sys.stdin.read()
891c8d20f80f mq: support qimport -
Brendan Cully <brendan@kublai.com>
parents: 3492
diff changeset
  1706
                    else:
7271
8046f0a070a6 use our urlopener (proxy handling, etc) instead of urllib
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7216
diff changeset
  1707
                        text = url.open(self.ui, filename).read()
7421
4c4324476be6 Catch both IOError and OSError, fix regression introduced by 8046f0a070a6
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7414
diff changeset
  1708
                except (OSError, IOError):
6940
05ec27530d04 qimport: report filename in case of IOError
Martin Geisler <mg@daimi.au.dk>
parents: 6937
diff changeset
  1709
                    raise util.Abort(_("unable to read %s") % filename)
3133
15fde1970003 qimport: rename patch to patchname to avoid shadowing module
Brendan Cully <brendan@kublai.com>
parents: 3091
diff changeset
  1710
                if not patchname:
4037
bbdba01cce28 Enforce unixish style for all generated patch names.
Patrick Mezard <pmezard@gmail.com>
parents: 4016
diff changeset
  1711
                    patchname = normname(os.path.basename(filename))
5981
ca2af0c81c9a mq: don't allow patches with some reserved names
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5980
diff changeset
  1712
                self.check_reserved_name(patchname)
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1713
                checkfile(patchname)
3133
15fde1970003 qimport: rename patch to patchname to avoid shadowing module
Brendan Cully <brendan@kublai.com>
parents: 3091
diff changeset
  1714
                patchf = self.opener(patchname, "w")
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1715
                patchf.write(text)
7160
1b7b21b634f2 mq: make qimport -f work properly. Closes issue1255.
Brendan Cully <brendan@kublai.com>
parents: 7158
diff changeset
  1716
            if not force:
1b7b21b634f2 mq: make qimport -f work properly. Closes issue1255.
Brendan Cully <brendan@kublai.com>
parents: 7158
diff changeset
  1717
                checkseries(patchname)
1b7b21b634f2 mq: make qimport -f work properly. Closes issue1255.
Brendan Cully <brendan@kublai.com>
parents: 7158
diff changeset
  1718
            if patchname not in self.series:
1b7b21b634f2 mq: make qimport -f work properly. Closes issue1255.
Brendan Cully <brendan@kublai.com>
parents: 7158
diff changeset
  1719
                index = self.full_series_end() + i
1b7b21b634f2 mq: make qimport -f work properly. Closes issue1255.
Brendan Cully <brendan@kublai.com>
parents: 7158
diff changeset
  1720
                self.full_series[index:index] = [patchname]
2767
60683ab1ed33 mq: rename read_series as parse_series, make simpler and faster
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2766
diff changeset
  1721
            self.parse_series()
7597
81f68565281c mq, i18n: mark strings for translation
Martin Geisler <mg@daimi.au.dk>
parents: 7454
diff changeset
  1722
            self.ui.warn(_("adding %s to series file\n") % patchname)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1723
            i += 1
3133
15fde1970003 qimport: rename patch to patchname to avoid shadowing module
Brendan Cully <brendan@kublai.com>
parents: 3091
diff changeset
  1724
            added.append(patchname)
15fde1970003 qimport: rename patch to patchname to avoid shadowing module
Brendan Cully <brendan@kublai.com>
parents: 3091
diff changeset
  1725
            patchname = None
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1726
        self.series_dirty = 1
2488
2785aeb51be4 mq: add qimported patches if patch dir is a repo
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2301
diff changeset
  1727
        qrepo = self.qrepo()
2785aeb51be4 mq: add qimported patches if patch dir is a repo
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2301
diff changeset
  1728
        if qrepo:
2785aeb51be4 mq: add qimported patches if patch dir is a repo
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2301
diff changeset
  1729
            qrepo.add(added)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1730
3373
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
  1731
def delete(ui, repo, *patches, **opts):
2905
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2904
diff changeset
  1732
    """remove patches from queue
2752
5dfeda163bb7 Add -f option to qdelete, to remove patch file.
Brendan Cully <brendan@kublai.com>
parents: 2751
diff changeset
  1733
8929
cb05e2a00291 mq: compact & rewrap documentation for qdelete command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8904
diff changeset
  1734
    The patches must not be applied, and at least one patch is required. With
cb05e2a00291 mq: compact & rewrap documentation for qdelete command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8904
diff changeset
  1735
    -k/--keep, the patch files are preserved in the patch directory.
8904
8be38b624902 mq: no longer mention the deprecated qdelete's --revision option
Cédric Duval <cedricduval@free.fr>
parents: 8894
diff changeset
  1736
8be38b624902 mq: no longer mention the deprecated qdelete's --revision option
Cédric Duval <cedricduval@free.fr>
parents: 8894
diff changeset
  1737
    To stop managing a patch and move it into permanent history,
8be38b624902 mq: no longer mention the deprecated qdelete's --revision option
Cédric Duval <cedricduval@free.fr>
parents: 8894
diff changeset
  1738
    use the qfinish command."""
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  1739
    q = repo.mq
3373
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
  1740
    q.delete(repo, patches, opts)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1741
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1742
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1743
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1744
def applied(ui, repo, patch=None, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1745
    """print the patches already applied"""
9364
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  1746
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1747
    q = repo.mq
9364
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  1748
    l = len(q.applied)
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  1749
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1750
    if patch:
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1751
        if patch not in q.series:
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1752
            raise util.Abort(_("patch %s is not in series file") % patch)
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1753
        end = q.series.index(patch) + 1
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1754
    else:
4239
417c2068cb92 Simplified qseries and hg qapplied to fix some bugs caused by optimization:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4238
diff changeset
  1755
        end = q.series_end(True)
9364
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  1756
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  1757
    if opts.get('last') and not end:
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  1758
        ui.write(_("no patches applied\n"))
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  1759
        return 1
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  1760
    elif opts.get('last') and end == 1:
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  1761
        ui.write(_("only one patch applied\n"))
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  1762
        return 1
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  1763
    elif opts.get('last'):
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  1764
        start = end - 2
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  1765
        end = 1
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  1766
    else:
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  1767
        start = 0
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  1768
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  1769
    return q.qseries(repo, length=end, start=start, status='A',
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  1770
                     summary=opts.get('summary'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1771
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1772
def unapplied(ui, repo, patch=None, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1773
    """print the patches not yet applied"""
9364
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  1774
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1775
    q = repo.mq
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1776
    if patch:
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1777
        if patch not in q.series:
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1778
            raise util.Abort(_("patch %s is not in series file") % patch)
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1779
        start = q.series.index(patch) + 1
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1780
    else:
4238
ce6c364ebb2a Fix issue443: inconsistent output of "hg qunapplied -v"
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4173
diff changeset
  1781
        start = q.series_end(True)
9364
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  1782
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  1783
    if start == len(q.series) and opts.get('first'):
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  1784
        ui.write(_("all patches applied\n"))
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  1785
        return 1
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  1786
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  1787
    length = opts.get('first') and 1 or None
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  1788
    return q.qseries(repo, start=start, length=length, status='U',
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  1789
                     summary=opts.get('summary'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1790
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1791
def qimport(ui, repo, *filename, **opts):
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1792
    """import a patch
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1793
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  1794
    The patch is inserted into the series after the last applied
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  1795
    patch. If no patches have been applied, qimport prepends the patch
6634
d6caebe9c293 mq: qimport: explain insertion point in doc string
Adrian Buehlmann <adrian@cadifra.com>
parents: 6627
diff changeset
  1796
    to the series.
d6caebe9c293 mq: qimport: explain insertion point in doc string
Adrian Buehlmann <adrian@cadifra.com>
parents: 6627
diff changeset
  1797
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1798
    The patch will have the same name as its source file unless you
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  1799
    give it a new one with -n/--name.
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1800
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  1801
    You can register an existing patch inside the patch directory with
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  1802
    the -e/--existing flag.
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1803
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  1804
    With -f/--force, an existing patch of the same name will be
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  1805
    overwritten.
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1806
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  1807
    An existing changeset may be placed under mq control with -r/--rev
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1808
    (e.g. qimport --rev tip -n patch will place tip under mq control).
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  1809
    With -g/--git, patches imported with --rev will use the git diff
7387
7e9a15fa6c8f update help on git diffs
Matt Mackall <mpm@selenic.com>
parents: 7308
diff changeset
  1810
    format. See the diffs help topic for information on why this is
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  1811
    important for preserving rename/copy information and permission
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  1812
    changes.
8075
1f0a5a5fff43 Update qimport help explaining how to read a patch from stdin (Issue371)
David Frey <dpfrey@shaw.ca>
parents: 8028
diff changeset
  1813
1f0a5a5fff43 Update qimport help explaining how to read a patch from stdin (Issue371)
David Frey <dpfrey@shaw.ca>
parents: 8028
diff changeset
  1814
    To import a patch from standard input, pass - as the patch file.
1f0a5a5fff43 Update qimport help explaining how to read a patch from stdin (Issue371)
David Frey <dpfrey@shaw.ca>
parents: 8028
diff changeset
  1815
    When importing from standard input, a patch name must be specified
1f0a5a5fff43 Update qimport help explaining how to read a patch from stdin (Issue371)
David Frey <dpfrey@shaw.ca>
parents: 8028
diff changeset
  1816
    using the --name flag.
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1817
    """
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  1818
    q = repo.mq
3133
15fde1970003 qimport: rename patch to patchname to avoid shadowing module
Brendan Cully <brendan@kublai.com>
parents: 3091
diff changeset
  1819
    q.qimport(repo, filename, patchname=opts['name'],
3691
79151c94c3b4 mq: add --git option to qimport -r
Brendan Cully <brendan@kublai.com>
parents: 3685
diff changeset
  1820
              existing=opts['existing'], force=opts['force'], rev=opts['rev'],
79151c94c3b4 mq: add --git option to qimport -r
Brendan Cully <brendan@kublai.com>
parents: 3685
diff changeset
  1821
              git=opts['git'])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1822
    q.save_dirty()
8362
bbc74c05b8a4 mq: add -P/--push option to qimport
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8288
diff changeset
  1823
bbc74c05b8a4 mq: add -P/--push option to qimport
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8288
diff changeset
  1824
    if opts.get('push') and not opts.get('rev'):
bbc74c05b8a4 mq: add -P/--push option to qimport
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8288
diff changeset
  1825
        return q.push(repo, None)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1826
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1827
10480
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  1828
def qinit(ui, repo, create):
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  1829
    """initialize a new queue repository
2754
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  1830
10480
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  1831
    This command also creates a series file for ordering patches, and
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  1832
    an mq-specific .hgignore file in the queue repository, to exclude
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  1833
    the status and guards files (these contain mostly transient state)."""
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  1834
    q = repo.mq
10480
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  1835
    r = q.init(repo, create)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1836
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1837
    if r:
4071
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1838
        if not os.path.exists(r.wjoin('.hgignore')):
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1839
            fp = r.wopener('.hgignore', 'w')
6034
83633602e2c5 qinit -c: add ^\.hg and ^\.mq to .hgignore
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6027
diff changeset
  1840
            fp.write('^\\.hg\n')
83633602e2c5 qinit -c: add ^\.hg and ^\.mq to .hgignore
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6027
diff changeset
  1841
            fp.write('^\\.mq\n')
4071
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1842
            fp.write('syntax: glob\n')
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1843
            fp.write('status\n')
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1844
            fp.write('guards\n')
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1845
            fp.close()
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1846
        if not os.path.exists(r.wjoin('series')):
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1847
            r.wopener('series', 'w').close()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1848
        r.add(['.hgignore', 'series'])
4071
165abe554c80 mq: qinit -c creates a repo even after a regular qinit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4068
diff changeset
  1849
        commands.add(ui, r)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1850
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1851
10480
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  1852
def init(ui, repo, **opts):
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  1853
    """init a new queue repository (DEPRECATED)
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  1854
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  1855
    The queue repository is unversioned by default. If
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  1856
    -c/--create-repo is specified, qinit will create a separate nested
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  1857
    repository for patches (qinit -c may also be run later to convert
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  1858
    an unversioned patch repository into a versioned one). You can use
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  1859
    qcommit to commit changes to this queue repository.
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  1860
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  1861
    This command is deprecated. Without -c, it's implied by other relevant
10591
ff2704a8ded3 mq: drop -Q in favor of --mq only
Matt Mackall <mpm@selenic.com>
parents: 10589
diff changeset
  1862
    commands. With -c, use hg init --mq instead."""
10480
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  1863
    return qinit(ui, repo, create=opts['create_repo'])
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  1864
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1865
def clone(ui, source, dest=None, **opts):
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1866
    '''clone main and patch repository at same time
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1867
7983
7b813bdbd5d0 Change double spaces to single spaces in help texts.
Martin Geisler <mg@daimi.au.dk>
parents: 7874
diff changeset
  1868
    If source is local, destination will have no patches applied. If
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1869
    source is remote, this command can not check if patches are
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1870
    applied in source, so cannot guarantee that patches are not
7983
7b813bdbd5d0 Change double spaces to single spaces in help texts.
Martin Geisler <mg@daimi.au.dk>
parents: 7874
diff changeset
  1871
    applied in destination. If you clone remote repository, be sure
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1872
    before that it has no patches applied.
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1873
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1874
    Source patch repository is looked for in <src>/.hg/patches by
7983
7b813bdbd5d0 Change double spaces to single spaces in help texts.
Martin Geisler <mg@daimi.au.dk>
parents: 7874
diff changeset
  1875
    default. Use -p <url> to change.
4862
cba10652a901 mq: improve qclone error handling when patch directory is not a repository.
Brendan Cully <brendan@kublai.com>
parents: 4737
diff changeset
  1876
8760
bf17aeafb869 Spell Mercurial as a proper noun
timeless <timeless@gmail.com>
parents: 8711
diff changeset
  1877
    The patch directory must be a nested Mercurial repository, as
10690
ea85c01c7835 mq: no longer refer to deprecated qinit -c command
Cédric Duval <cedricduval@free.fr>
parents: 10689
diff changeset
  1878
    would be created by init --mq.
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1879
    '''
5226
438ff951df70 avoid double slash problem mentioned in issue695
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5180
diff changeset
  1880
    def patchdir(repo):
438ff951df70 avoid double slash problem mentioned in issue695
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5180
diff changeset
  1881
        url = repo.url()
438ff951df70 avoid double slash problem mentioned in issue695
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5180
diff changeset
  1882
        if url.endswith('/'):
438ff951df70 avoid double slash problem mentioned in issue695
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5180
diff changeset
  1883
            url = url[:-1]
438ff951df70 avoid double slash problem mentioned in issue695
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5180
diff changeset
  1884
        return url + '/.hg/patches'
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1885
    if dest is None:
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1886
        dest = hg.defaultdest(source)
8188
f3abe032fc89 add cmdutil.remoteui
Matt Mackall <mpm@selenic.com>
parents: 8152
diff changeset
  1887
    sr = hg.repository(cmdutil.remoteui(ui, opts), ui.expandpath(source))
7729
dd08e1e0cea1 mq: allow qclone's -p option to use path alias
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7639
diff changeset
  1888
    if opts['patches']:
dd08e1e0cea1 mq: allow qclone's -p option to use path alias
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7639
diff changeset
  1889
        patchespath = ui.expandpath(opts['patches'])
dd08e1e0cea1 mq: allow qclone's -p option to use path alias
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7639
diff changeset
  1890
    else:
dd08e1e0cea1 mq: allow qclone's -p option to use path alias
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7639
diff changeset
  1891
        patchespath = patchdir(sr)
4862
cba10652a901 mq: improve qclone error handling when patch directory is not a repository.
Brendan Cully <brendan@kublai.com>
parents: 4737
diff changeset
  1892
    try:
7874
d812029cda85 cleanup: drop variables for unused return values
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7782
diff changeset
  1893
        hg.repository(ui, patchespath)
7637
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 7627
diff changeset
  1894
    except error.RepoError:
4862
cba10652a901 mq: improve qclone error handling when patch directory is not a repository.
Brendan Cully <brendan@kublai.com>
parents: 4737
diff changeset
  1895
        raise util.Abort(_('versioned patch repository not found'
10690
ea85c01c7835 mq: no longer refer to deprecated qinit -c command
Cédric Duval <cedricduval@free.fr>
parents: 10689
diff changeset
  1896
                           ' (see init --mq)'))
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1897
    qbase, destrev = None, None
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1898
    if sr.local():
2725
9ffee4f07323 mq: update to handle repomap not longer used
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2724
diff changeset
  1899
        if sr.mq.applied:
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
  1900
            qbase = bin(sr.mq.applied[0].rev)
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1901
            if not hg.islocal(dest):
8152
08e1baf924ca replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents: 8151
diff changeset
  1902
                heads = set(sr.heads())
08e1baf924ca replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents: 8151
diff changeset
  1903
                destrev = list(heads.difference(sr.heads(qbase)))
4171
1df1baf2002e fix qclone to a remote repo
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4133
diff changeset
  1904
                destrev.append(sr.changelog.parents(qbase)[0])
6164
0c2b443fb3c3 mq: make qclone ask remote source repo for qbase using lookup protocol
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 6139
diff changeset
  1905
    elif sr.capable('lookup'):
6380
a632a9a57821 qclone: do not abort if remote hasn't enabled mq (issue1040)
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6340
diff changeset
  1906
        try:
a632a9a57821 qclone: do not abort if remote hasn't enabled mq (issue1040)
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6340
diff changeset
  1907
            qbase = sr.lookup('qbase')
7637
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 7627
diff changeset
  1908
        except error.RepoError:
6380
a632a9a57821 qclone: do not abort if remote hasn't enabled mq (issue1040)
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6340
diff changeset
  1909
            pass
8027
9c7ca86fc658 expand "repo" to "repository" in help texts
Martin Geisler <mg@lazybytes.net>
parents: 8026
diff changeset
  1910
    ui.note(_('cloning main repository\n'))
4476
4ef8fdf57e39 mq: pass a URL to clone
Matt Mackall <mpm@selenic.com>
parents: 4437
diff changeset
  1911
    sr, dr = hg.clone(ui, sr.url(), dest,
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1912
                      pull=opts['pull'],
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1913
                      rev=destrev,
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1914
                      update=False,
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1915
                      stream=opts['uncompressed'])
8027
9c7ca86fc658 expand "repo" to "repository" in help texts
Martin Geisler <mg@lazybytes.net>
parents: 8026
diff changeset
  1916
    ui.note(_('cloning patch repository\n'))
7874
d812029cda85 cleanup: drop variables for unused return values
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7782
diff changeset
  1917
    hg.clone(ui, opts['patches'] or patchdir(sr), patchdir(dr),
d812029cda85 cleanup: drop variables for unused return values
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7782
diff changeset
  1918
             pull=opts['pull'], update=not opts['noupdate'],
d812029cda85 cleanup: drop variables for unused return values
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7782
diff changeset
  1919
             stream=opts['uncompressed'])
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1920
    if dr.local():
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1921
        if qbase:
8027
9c7ca86fc658 expand "repo" to "repository" in help texts
Martin Geisler <mg@lazybytes.net>
parents: 8026
diff changeset
  1922
            ui.note(_('stripping applied patches from destination '
9c7ca86fc658 expand "repo" to "repository" in help texts
Martin Geisler <mg@lazybytes.net>
parents: 8026
diff changeset
  1923
                      'repository\n'))
2725
9ffee4f07323 mq: update to handle repomap not longer used
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2724
diff changeset
  1924
            dr.mq.strip(dr, qbase, update=False, backup=None)
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1925
        if not opts['noupdate']:
8027
9c7ca86fc658 expand "repo" to "repository" in help texts
Martin Geisler <mg@lazybytes.net>
parents: 8026
diff changeset
  1926
            ui.note(_('updating destination repository\n'))
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents: 2772
diff changeset
  1927
            hg.update(dr, dr.changelog.tip())
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  1928
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1929
def commit(ui, repo, *pats, **opts):
10361
49cd2e7fd91c mq: deprecate qinit and qcommit
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10360
diff changeset
  1930
    """commit changes in the queue repository (DEPRECATED)
49cd2e7fd91c mq: deprecate qinit and qcommit
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10360
diff changeset
  1931
10755
32023a0a389b mq: fix qcommit documentation wrt --mq option
Patrick Mezard <pmezard@gmail.com>
parents: 10730
diff changeset
  1932
    This command is deprecated; use hg commit --mq instead."""
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  1933
    q = repo.mq
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1934
    r = q.qrepo()
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  1935
    if not r:
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  1936
        raise util.Abort('no queue repository')
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1937
    commands.commit(r.ui, r, *pats, **opts)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1938
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1939
def series(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1940
    """print the entire series file"""
2756
caa6d992608b Add -s option to qseries: display first line of patch header.
Brendan Cully <brendan@kublai.com>
parents: 2754
diff changeset
  1941
    repo.mq.qseries(repo, missing=opts['missing'], summary=opts['summary'])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1942
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1943
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1944
def top(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1945
    """print the name of the current patch"""
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1946
    q = repo.mq
4406
f700ea2b0689 mq: fix qtop failure when the series ends with guarded patches.
Patrick Mezard <pmezard@gmail.com>
parents: 4341
diff changeset
  1947
    t = q.applied and q.series_end(True) or 0
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1948
    if t:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  1949
        return q.qseries(repo, start=t - 1, length=1, status='A',
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1950
                         summary=opts.get('summary'))
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1951
    else:
7627
fb32ae9c76e7 mq: lowercase output
Martin Geisler <mg@daimi.au.dk>
parents: 7621
diff changeset
  1952
        ui.write(_("no patches applied\n"))
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1953
        return 1
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1954
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1955
def next(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1956
    """print the name of the next patch"""
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1957
    q = repo.mq
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1958
    end = q.series_end()
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1959
    if end == len(q.series):
7627
fb32ae9c76e7 mq: lowercase output
Martin Geisler <mg@daimi.au.dk>
parents: 7621
diff changeset
  1960
        ui.write(_("all patches applied\n"))
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1961
        return 1
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1962
    return q.qseries(repo, start=end, length=1, summary=opts.get('summary'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1963
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1964
def prev(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1965
    """print the name of the previous patch"""
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1966
    q = repo.mq
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1967
    l = len(q.applied)
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1968
    if l == 1:
7627
fb32ae9c76e7 mq: lowercase output
Martin Geisler <mg@daimi.au.dk>
parents: 7621
diff changeset
  1969
        ui.write(_("only one patch applied\n"))
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1970
        return 1
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1971
    if not l:
7627
fb32ae9c76e7 mq: lowercase output
Martin Geisler <mg@daimi.au.dk>
parents: 7621
diff changeset
  1972
        ui.write(_("no patches applied\n"))
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1973
        return 1
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  1974
    return q.qseries(repo, start=l - 2, length=1, status='A',
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1975
                     summary=opts.get('summary'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1976
5673
dd3ce7515f4d mq: add --currentuser and --user options to qnew and qrefresh
peter.arrenbrecht@gmail.com
parents: 5645
diff changeset
  1977
def setupheaderopts(ui, opts):
9733
f16ec85f125c mq: do not call ui.username unless it is necessary
Martin Geisler <mg@lazybytes.net>
parents: 9725
diff changeset
  1978
    if not opts.get('user') and opts.get('currentuser'):
f16ec85f125c mq: do not call ui.username unless it is necessary
Martin Geisler <mg@lazybytes.net>
parents: 9725
diff changeset
  1979
        opts['user'] = ui.username()
f16ec85f125c mq: do not call ui.username unless it is necessary
Martin Geisler <mg@lazybytes.net>
parents: 9725
diff changeset
  1980
    if not opts.get('date') and opts.get('currentdate'):
f16ec85f125c mq: do not call ui.username unless it is necessary
Martin Geisler <mg@lazybytes.net>
parents: 9725
diff changeset
  1981
        opts['date'] = "%d %d" % util.makedate()
5673
dd3ce7515f4d mq: add --currentuser and --user options to qnew and qrefresh
peter.arrenbrecht@gmail.com
parents: 5645
diff changeset
  1982
4713
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
  1983
def new(ui, repo, patch, *args, **opts):
2754
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  1984
    """create a new patch
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  1985
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  1986
    qnew creates a new patch on top of the currently-applied patch (if
10808
1ebba857b371 mq: remove reference for deprecated -f option
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 10770
diff changeset
  1987
    any). The patch will be initialized with any outstanding changes
1ebba857b371 mq: remove reference for deprecated -f option
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 10770
diff changeset
  1988
    in the working directory. You may also use -I/--include,
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  1989
    -X/--exclude, and/or a list of files after the patch name to add
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  1990
    only changes to matching files to the new patch, leaving the rest
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  1991
    as uncommitted modifications.
2754
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  1992
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  1993
    -u/--user and -d/--date can be used to set the (given) user and
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  1994
    date, respectively. -U/--currentuser and -D/--currentdate set user
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  1995
    to current user and date to current date.
7306
8e46e59aaf4c mq: reflow qnew help, add help for options
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7297
diff changeset
  1996
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  1997
    -e/--edit, -m/--message or -l/--logfile set the patch header as
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  1998
    well as the commit message. If none is specified, the header is
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  1999
    empty and the commit message is '[mq]: PATCH'.
7307
56380212d630 help: commands supporting --git point to the gitdiffs topic (issue1352)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7306
diff changeset
  2000
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  2001
    Use the -g/--git option to keep the patch in the git extended diff
7387
7e9a15fa6c8f update help on git diffs
Matt Mackall <mpm@selenic.com>
parents: 7308
diff changeset
  2002
    format. Read the diffs help topic for more information on why this
7e9a15fa6c8f update help on git diffs
Matt Mackall <mpm@selenic.com>
parents: 7308
diff changeset
  2003
    is important for preserving permission changes and copy/rename
7e9a15fa6c8f update help on git diffs
Matt Mackall <mpm@selenic.com>
parents: 7308
diff changeset
  2004
    information.
7306
8e46e59aaf4c mq: reflow qnew help, add help for options
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7297
diff changeset
  2005
    """
7157
fd3cba5e73ae mq: do not invoke editor until just before patch creation. Closes issue1346.
Brendan Cully <brendan@kublai.com>
parents: 7142
diff changeset
  2006
    msg = cmdutil.logmessage(opts)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  2007
    def getmsg():
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  2008
        return ui.edit(msg, ui.username())
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  2009
    q = repo.mq
7157
fd3cba5e73ae mq: do not invoke editor until just before patch creation. Closes issue1346.
Brendan Cully <brendan@kublai.com>
parents: 7142
diff changeset
  2010
    opts['msg'] = msg
fd3cba5e73ae mq: do not invoke editor until just before patch creation. Closes issue1346.
Brendan Cully <brendan@kublai.com>
parents: 7142
diff changeset
  2011
    if opts.get('edit'):
fd3cba5e73ae mq: do not invoke editor until just before patch creation. Closes issue1346.
Brendan Cully <brendan@kublai.com>
parents: 7142
diff changeset
  2012
        opts['msg'] = getmsg
fd3cba5e73ae mq: do not invoke editor until just before patch creation. Closes issue1346.
Brendan Cully <brendan@kublai.com>
parents: 7142
diff changeset
  2013
    else:
fd3cba5e73ae mq: do not invoke editor until just before patch creation. Closes issue1346.
Brendan Cully <brendan@kublai.com>
parents: 7142
diff changeset
  2014
        opts['msg'] = msg
5673
dd3ce7515f4d mq: add --currentuser and --user options to qnew and qrefresh
peter.arrenbrecht@gmail.com
parents: 5645
diff changeset
  2015
    setupheaderopts(ui, opts)
4713
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
  2016
    q.new(repo, patch, *args, **opts)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2017
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2018
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2019
2938
5b7a118f5b6c allow qrefresh to take a list of files; closes #96.
Brendan Cully <brendan@kublai.com>
parents: 2937
diff changeset
  2020
def refresh(ui, repo, *pats, **opts):
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2021
    """update the current patch
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2022
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2023
    If any file patterns are provided, the refreshed patch will
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2024
    contain only the modifications that match those patterns; the
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2025
    remaining modifications will remain in the working directory.
4048
5d6b3fa62736 mq: Mention usage of hg add/remove/copy/rename in qrefresh help text.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4040
diff changeset
  2026
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  2027
    If -s/--short is specified, files currently included in the patch
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2028
    will be refreshed just like matched files and remain in the patch.
7113
f7fc5f5ecd62 mq: Allow qrefresh --silent to take parameters
Mads Kiilerich <mads@kiilerich.com>
parents: 7002
diff changeset
  2029
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2030
    hg add/remove/copy/rename work as usual, though you might want to
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  2031
    use git-style patches (-g/--git or [diff] git=1) to track copies
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  2032
    and renames. See the diffs help topic for more information on the
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  2033
    git diff format.
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2034
    """
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  2035
    q = repo.mq
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4476
diff changeset
  2036
    message = cmdutil.logmessage(opts)
2746
0503eb5c0a33 Add option -e/--edit to qrefresh, to edit the existing header.
Brendan Cully <brendan@kublai.com>
parents: 2745
diff changeset
  2037
    if opts['edit']:
5334
448eb46d4d84 mq: fix qrefresh -e with no patches applied
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5226
diff changeset
  2038
        if not q.applied:
7627
fb32ae9c76e7 mq: lowercase output
Martin Geisler <mg@daimi.au.dk>
parents: 7621
diff changeset
  2039
            ui.write(_("no patches applied\n"))
5334
448eb46d4d84 mq: fix qrefresh -e with no patches applied
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5226
diff changeset
  2040
            return 1
2746
0503eb5c0a33 Add option -e/--edit to qrefresh, to edit the existing header.
Brendan Cully <brendan@kublai.com>
parents: 2745
diff changeset
  2041
        if message:
0503eb5c0a33 Add option -e/--edit to qrefresh, to edit the existing header.
Brendan Cully <brendan@kublai.com>
parents: 2745
diff changeset
  2042
            raise util.Abort(_('option "-e" incompatible with "-m" or "-l"'))
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
  2043
        patch = q.applied[-1].name
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
  2044
        ph = patchheader(q.join(patch), q.plainmode)
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
  2045
        message = ui.edit('\n'.join(ph.message), ph.user or ui.username())
5673
dd3ce7515f4d mq: add --currentuser and --user options to qnew and qrefresh
peter.arrenbrecht@gmail.com
parents: 5645
diff changeset
  2046
    setupheaderopts(ui, opts)
3004
ac74046f8f58 qrefresh: exit with status 1 if no patches applied.
Bryan O'Sullivan <bos@serpentine.com>
parents: 2984
diff changeset
  2047
    ret = q.refresh(repo, pats, msg=message, **opts)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2048
    q.save_dirty()
3004
ac74046f8f58 qrefresh: exit with status 1 if no patches applied.
Bryan O'Sullivan <bos@serpentine.com>
parents: 2984
diff changeset
  2049
    return ret
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2050
2937
9dc568f5e03d Fix test-mq-qdiff; add -I and -X options to qdiff
Brendan Cully <brendan@kublai.com>
parents: 2936
diff changeset
  2051
def diff(ui, repo, *pats, **opts):
6606
088ba40585b9 mq: expand help text for qdiff
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6561
diff changeset
  2052
    """diff of the current patch and subsequent modifications
6621
d5cbbe2c49ce mq: lose the trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6611
diff changeset
  2053
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2054
    Shows a diff which includes the current patch as well as any
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2055
    changes which have been made in the working directory since the
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2056
    last refresh (thus showing what the current patch would become
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2057
    after a qrefresh).
6621
d5cbbe2c49ce mq: lose the trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6611
diff changeset
  2058
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2059
    Use 'hg diff' if you only want to see the changes made since the
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2060
    last qrefresh, or 'hg export qtip' if you want to see changes made
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2061
    by the current patch without including changes made since the
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2062
    qrefresh.
6606
088ba40585b9 mq: expand help text for qdiff
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6561
diff changeset
  2063
    """
2937
9dc568f5e03d Fix test-mq-qdiff; add -I and -X options to qdiff
Brendan Cully <brendan@kublai.com>
parents: 2936
diff changeset
  2064
    repo.mq.diff(repo, pats, opts)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2065
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2066
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2067
def fold(ui, repo, *files, **opts):
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2068
    """fold the named patches into the current patch
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2069
2771
519bf0cd28d2 Add -f option to qfold; improve qfold documentation.
Brendan Cully <brendan@kublai.com>
parents: 2770
diff changeset
  2070
    Patches must not yet be applied. Each patch will be successively
519bf0cd28d2 Add -f option to qfold; improve qfold documentation.
Brendan Cully <brendan@kublai.com>
parents: 2770
diff changeset
  2071
    applied to the current patch in the order given. If all the
519bf0cd28d2 Add -f option to qfold; improve qfold documentation.
Brendan Cully <brendan@kublai.com>
parents: 2770
diff changeset
  2072
    patches apply successfully, the current patch will be refreshed
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2073
    with the new cumulative patch, and the folded patches will be
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2074
    deleted. With -k/--keep, the folded patch files will not be
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2075
    removed afterwards.
2771
519bf0cd28d2 Add -f option to qfold; improve qfold documentation.
Brendan Cully <brendan@kublai.com>
parents: 2770
diff changeset
  2076
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2077
    The header for each folded patch will be concatenated with the
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2078
    current patch header, separated by a line of '* * *'."""
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2079
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2080
    q = repo.mq
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2081
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2082
    if not files:
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2083
        raise util.Abort(_('qfold requires at least one patch name'))
10191
99d285ac5da4 mq: qdiff with the same diff options than qrefresh (issue1350)
Patrick Mezard <pmezard@gmail.com>
parents: 10190
diff changeset
  2084
    if not q.check_toppatch(repo)[0]:
3072
bc3fe3b5b785 Never apply string formatting to generated errors with util.Abort.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3027
diff changeset
  2085
        raise util.Abort(_('No patches applied'))
8425
73d80d5bf478 mq: abort qfold upon local changes (issue1662)
David Frey <dpfrey@shaw.ca>
parents: 7782
diff changeset
  2086
    q.check_localchanges(repo)
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2087
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4476
diff changeset
  2088
    message = cmdutil.logmessage(opts)
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2089
    if opts['edit']:
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2090
        if message:
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2091
            raise util.Abort(_('option "-e" incompatible with "-m" or "-l"'))
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2092
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2093
    parent = q.lookup('qtip')
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2094
    patches = []
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2095
    messages = []
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2096
    for f in files:
2936
21bf8929efc8 Fix qfold after recent changes
Brendan Cully <brendan@kublai.com>
parents: 2934
diff changeset
  2097
        p = q.lookup(f)
21bf8929efc8 Fix qfold after recent changes
Brendan Cully <brendan@kublai.com>
parents: 2934
diff changeset
  2098
        if p in patches or p == parent:
21bf8929efc8 Fix qfold after recent changes
Brendan Cully <brendan@kublai.com>
parents: 2934
diff changeset
  2099
            ui.warn(_('Skipping already folded patch %s') % p)
21bf8929efc8 Fix qfold after recent changes
Brendan Cully <brendan@kublai.com>
parents: 2934
diff changeset
  2100
        if q.isapplied(p):
21bf8929efc8 Fix qfold after recent changes
Brendan Cully <brendan@kublai.com>
parents: 2934
diff changeset
  2101
            raise util.Abort(_('qfold cannot fold already applied patch %s') % p)
21bf8929efc8 Fix qfold after recent changes
Brendan Cully <brendan@kublai.com>
parents: 2934
diff changeset
  2102
        patches.append(p)
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2103
2936
21bf8929efc8 Fix qfold after recent changes
Brendan Cully <brendan@kublai.com>
parents: 2934
diff changeset
  2104
    for p in patches:
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2105
        if not message:
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
  2106
            ph = patchheader(q.join(p), q.plainmode)
7454
1d5ecaa47abb mq: filter out empty commit messages in qfold
Brendan Cully <brendan@kublai.com>
parents: 7453
diff changeset
  2107
            if ph.message:
1d5ecaa47abb mq: filter out empty commit messages in qfold
Brendan Cully <brendan@kublai.com>
parents: 7453
diff changeset
  2108
                messages.append(ph.message)
2936
21bf8929efc8 Fix qfold after recent changes
Brendan Cully <brendan@kublai.com>
parents: 2934
diff changeset
  2109
        pf = q.join(p)
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2110
        (patchsuccess, files, fuzz) = q.patch(repo, pf)
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2111
        if not patchsuccess:
2936
21bf8929efc8 Fix qfold after recent changes
Brendan Cully <brendan@kublai.com>
parents: 2934
diff changeset
  2112
            raise util.Abort(_('Error folding patch %s') % p)
21bf8929efc8 Fix qfold after recent changes
Brendan Cully <brendan@kublai.com>
parents: 2934
diff changeset
  2113
        patch.updatedir(ui, repo, files)
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2114
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2115
    if not message:
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
  2116
        ph = patchheader(q.join(parent), q.plainmode)
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
  2117
        message, user = ph.message, ph.user
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2118
        for msg in messages:
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2119
            message.append('* * *')
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2120
            message.extend(msg)
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2121
        message = '\n'.join(message)
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2122
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2123
    if opts['edit']:
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2124
        message = ui.edit(message, user or ui.username())
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2125
10186
296a0b14a686 mq: preserve --git flag when folding patches
Patrick Mezard <pmezard@gmail.com>
parents: 10185
diff changeset
  2126
    diffopts = q.patchopts(q.diffopts(), *patches)
296a0b14a686 mq: preserve --git flag when folding patches
Patrick Mezard <pmezard@gmail.com>
parents: 10185
diff changeset
  2127
    q.refresh(repo, msg=message, git=diffopts.git)
3243
1d3aceae87c1 mq: update qfold to call delete correctly
Brendan Cully <brendan@kublai.com>
parents: 3223
diff changeset
  2128
    q.delete(repo, patches, opts)
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2129
    q.save_dirty()
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2130
4432
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  2131
def goto(ui, repo, patch, **opts):
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  2132
    '''push or pop patches until named patch is at top of stack'''
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  2133
    q = repo.mq
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  2134
    patch = q.lookup(patch)
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  2135
    if q.isapplied(patch):
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  2136
        ret = q.pop(repo, patch, force=opts['force'])
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  2137
    else:
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  2138
        ret = q.push(repo, patch, force=opts['force'])
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  2139
    q.save_dirty()
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  2140
    return ret
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  2141
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2142
def guard(ui, repo, *args, **opts):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2143
    '''set or print guards for a patch
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2144
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2145
    Guards control whether a patch can be pushed. A patch with no
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2146
    guards is always pushed. A patch with a positive guard ("+foo") is
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2147
    pushed only if the qselect command has activated it. A patch with
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2148
    a negative guard ("-foo") is never pushed if the qselect command
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2149
    has activated it.
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2150
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2151
    With no arguments, print the currently active guards.
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2152
    With arguments, set guards for the named patch.
7772
88887054d277 fancyopts: Parse options that occur after arguments.
Augie Fackler <durin42@gmail.com>
parents: 7729
diff changeset
  2153
    NOTE: Specifying negative guards now requires '--'.
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2154
9824
87c92b260710 mq: fix literal blocks in docstrings
Martin Geisler <mg@lazybytes.net>
parents: 9733
diff changeset
  2155
    To set guards on another patch::
87c92b260710 mq: fix literal blocks in docstrings
Martin Geisler <mg@lazybytes.net>
parents: 9733
diff changeset
  2156
10476
3113736dbac5 mq: more instructive use of "--" in qguard help (issue2040)
Martin Geisler <mg@lazybytes.net>
parents: 10413
diff changeset
  2157
      hg qguard other.patch -- +2.6.17 -stable
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2158
    '''
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2159
    def status(idx):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2160
        guards = q.series_guards[idx] or ['unguarded']
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2161
        ui.write('%s: %s\n' % (q.series[idx], ' '.join(guards)))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2162
    q = repo.mq
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2163
    patch = None
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2164
    args = list(args)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2165
    if opts['list']:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2166
        if args or opts['none']:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2167
            raise util.Abort(_('cannot mix -l/--list with options or arguments'))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2168
        for i in xrange(len(q.series)):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2169
            status(i)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2170
        return
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2171
    if not args or args[0][0:1] in '-+':
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2172
        if not q.applied:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2173
            raise util.Abort(_('no patches applied'))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2174
        patch = q.applied[-1].name
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2175
    if patch is None and args[0][0:1] not in '-+':
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2176
        patch = args.pop(0)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2177
    if patch is None:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2178
        raise util.Abort(_('no patch to work with'))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2179
    if args or opts['none']:
4133
a9ee6c53af8d mq: abort cleanly when invalid patch name is given to qguard
Christian Ebert <blacktrash@gmx.net>
parents: 4090
diff changeset
  2180
        idx = q.find_series(patch)
a9ee6c53af8d mq: abort cleanly when invalid patch name is given to qguard
Christian Ebert <blacktrash@gmx.net>
parents: 4090
diff changeset
  2181
        if idx is None:
a9ee6c53af8d mq: abort cleanly when invalid patch name is given to qguard
Christian Ebert <blacktrash@gmx.net>
parents: 4090
diff changeset
  2182
            raise util.Abort(_('no patch named %s') % patch)
a9ee6c53af8d mq: abort cleanly when invalid patch name is given to qguard
Christian Ebert <blacktrash@gmx.net>
parents: 4090
diff changeset
  2183
        q.set_guards(idx, args)
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2184
        q.save_dirty()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2185
    else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2186
        status(q.series.index(q.lookup(patch)))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2187
2747
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  2188
def header(ui, repo, patch=None):
7598
26adfaccdf73 lowercase help output
Martin Geisler <mg@daimi.au.dk>
parents: 7597
diff changeset
  2189
    """print the header of the topmost or specified patch"""
2747
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  2190
    q = repo.mq
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  2191
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  2192
    if patch:
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  2193
        patch = q.lookup(patch)
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  2194
    else:
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  2195
        if not q.applied:
10510
f77f3383c666 i18n: mark more strings for translation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10498
diff changeset
  2196
            ui.write(_('no patches applied\n'))
3008
c203ccd7d838 qheader: exit withh meaningful error code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 3006
diff changeset
  2197
            return 1
2747
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  2198
        patch = q.lookup('qtip')
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
  2199
    ph = patchheader(q.join(patch), q.plainmode)
2747
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  2200
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
  2201
    ui.write('\n'.join(ph.message) + '\n')
2747
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  2202
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2203
def lastsavename(path):
2794
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
  2204
    (directory, base) = os.path.split(path)
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
  2205
    names = os.listdir(directory)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2206
    namere = re.compile("%s.([0-9]+)" % base)
2794
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
  2207
    maxindex = None
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2208
    maxname = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2209
    for f in names:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2210
        m = namere.match(f)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2211
        if m:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2212
            index = int(m.group(1))
8527
f9a80054dd3c use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents: 8525
diff changeset
  2213
            if maxindex is None or index > maxindex:
2794
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
  2214
                maxindex = index
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2215
                maxname = f
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2216
    if maxname:
2794
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
  2217
        return (os.path.join(directory, maxname), maxindex)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2218
    return (None, None)
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2219
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2220
def savename(path):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2221
    (last, index) = lastsavename(path)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2222
    if last is None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2223
        index = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2224
    newpath = path + ".%d" % (index + 1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2225
    return newpath
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2226
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2227
def push(ui, repo, patch=None, **opts):
6552
315b36ce6251 mq: add a little documentation on qpush -f
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6382
diff changeset
  2228
    """push the next patch onto the stack
6553
0bb76d168437 remove trailing spaces
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6552
diff changeset
  2229
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  2230
    When -f/--force is applied, all local changes in patched files
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  2231
    will be lost.
6552
315b36ce6251 mq: add a little documentation on qpush -f
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6382
diff changeset
  2232
    """
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  2233
    q = repo.mq
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2234
    mergeq = None
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2235
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2236
    if opts['merge']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2237
        if opts['name']:
6627
d9266e48cd27 mq: qpush -n fix
teki321@gmail.com
parents: 6621
diff changeset
  2238
            newpath = repo.join(opts['name'])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2239
        else:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2240
            newpath, i = lastsavename(q.path)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2241
        if not newpath:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  2242
            ui.warn(_("no saved queues found, please use -n\n"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2243
            return 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2244
        mergeq = queue(ui, repo.join(""), newpath)
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  2245
        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
  2246
    ret = q.push(repo, patch, force=opts['force'], list=opts['list'],
7398
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  2247
                 mergeq=mergeq, all=opts.get('all'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2248
    return ret
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2249
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2250
def pop(ui, repo, patch=None, **opts):
6611
f4c612da788d mq: add correct documentation for qpop
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6610
diff changeset
  2251
    """pop the current patch off the stack
6621
d5cbbe2c49ce mq: lose the trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6611
diff changeset
  2252
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2253
    By default, pops off the top of the patch stack. If given a patch
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2254
    name, keeps popping off patches until the named patch is at the
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2255
    top of the stack.
6611
f4c612da788d mq: add correct documentation for qpop
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6610
diff changeset
  2256
    """
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2257
    localupdate = True
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2258
    if opts['name']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2259
        q = queue(ui, repo.join(""), repo.join(opts['name']))
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  2260
        ui.warn(_('using patch queue: %s\n') % q.path)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2261
        localupdate = False
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2262
    else:
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  2263
        q = repo.mq
4099
cf5580c16b13 mq: propagate the return error of pop
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4096
diff changeset
  2264
    ret = q.pop(repo, patch, force=opts['force'], update=localupdate,
cf5580c16b13 mq: propagate the return error of pop
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4096
diff changeset
  2265
                all=opts['all'])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2266
    q.save_dirty()
4099
cf5580c16b13 mq: propagate the return error of pop
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4096
diff changeset
  2267
    return ret
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2268
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2269
def rename(ui, repo, patch, name=None, **opts):
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2270
    """rename a patch
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2271
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2272
    With one argument, renames the current patch to PATCH1.
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2273
    With two arguments, renames PATCH1 to PATCH2."""
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2274
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2275
    q = repo.mq
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2276
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2277
    if not name:
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2278
        name = patch
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2279
        patch = None
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2280
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2281
    if patch:
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2282
        patch = q.lookup(patch)
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2283
    else:
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2284
        if not q.applied:
7627
fb32ae9c76e7 mq: lowercase output
Martin Geisler <mg@daimi.au.dk>
parents: 7621
diff changeset
  2285
            ui.write(_('no patches applied\n'))
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2286
            return
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2287
        patch = q.lookup('qtip')
3083
82c9d1aac308 Make qrename handle directory targets; closes #333.
Brendan Cully <brendan@kublai.com>
parents: 3082
diff changeset
  2288
    absdest = q.join(name)
82c9d1aac308 Make qrename handle directory targets; closes #333.
Brendan Cully <brendan@kublai.com>
parents: 3082
diff changeset
  2289
    if os.path.isdir(absdest):
4037
bbdba01cce28 Enforce unixish style for all generated patch names.
Patrick Mezard <pmezard@gmail.com>
parents: 4016
diff changeset
  2290
        name = normname(os.path.join(name, os.path.basename(patch)))
3083
82c9d1aac308 Make qrename handle directory targets; closes #333.
Brendan Cully <brendan@kublai.com>
parents: 3082
diff changeset
  2291
        absdest = q.join(name)
82c9d1aac308 Make qrename handle directory targets; closes #333.
Brendan Cully <brendan@kublai.com>
parents: 3082
diff changeset
  2292
    if os.path.exists(absdest):
82c9d1aac308 Make qrename handle directory targets; closes #333.
Brendan Cully <brendan@kublai.com>
parents: 3082
diff changeset
  2293
        raise util.Abort(_('%s already exists') % absdest)
3223
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3186
diff changeset
  2294
3083
82c9d1aac308 Make qrename handle directory targets; closes #333.
Brendan Cully <brendan@kublai.com>
parents: 3082
diff changeset
  2295
    if name in q.series:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  2296
        raise util.Abort(
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  2297
            _('A patch named %s already exists in the series file') % name)
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2298
10510
f77f3383c666 i18n: mark more strings for translation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10498
diff changeset
  2299
    ui.note(_('renaming %s to %s\n') % (patch, name))
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2300
    i = q.find_series(patch)
3685
193e9c6d1a6d Issue424: mq patch loses guard when qrenamed
Mathieu Clabaut <mathieu.clabaut@gmail.com>
parents: 3681
diff changeset
  2301
    guards = q.guard_re.findall(q.full_series[i])
193e9c6d1a6d Issue424: mq patch loses guard when qrenamed
Mathieu Clabaut <mathieu.clabaut@gmail.com>
parents: 3681
diff changeset
  2302
    q.full_series[i] = name + ''.join([' #' + g for g in guards])
2767
60683ab1ed33 mq: rename read_series as parse_series, make simpler and faster
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2766
diff changeset
  2303
    q.parse_series()
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2304
    q.series_dirty = 1
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2305
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2306
    info = q.isapplied(patch)
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2307
    if info:
2818
bdc067ff6cf5 Make mq camelcase consistent with the rest of hg.
Brendan Cully <brendan@kublai.com>
parents: 2816
diff changeset
  2308
        q.applied[info[0]] = statusentry(info[1], name)
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2309
    q.applied_dirty = 1
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2310
2819
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
  2311
    util.rename(q.join(patch), absdest)
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2312
    r = q.qrepo()
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2313
    if r:
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2314
        wlock = r.wlock()
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  2315
        try:
6648
2519976a998b mq: handle added patch renaming correctly
Weijun Wang <weijun.wang@sun.com>
parents: 6635
diff changeset
  2316
            if r.dirstate[patch] == 'a':
2519976a998b mq: handle added patch renaming correctly
Weijun Wang <weijun.wang@sun.com>
parents: 6635
diff changeset
  2317
                r.dirstate.forget(patch)
2519976a998b mq: handle added patch renaming correctly
Weijun Wang <weijun.wang@sun.com>
parents: 6635
diff changeset
  2318
                r.dirstate.add(name)
2519976a998b mq: handle added patch renaming correctly
Weijun Wang <weijun.wang@sun.com>
parents: 6635
diff changeset
  2319
            else:
2519976a998b mq: handle added patch renaming correctly
Weijun Wang <weijun.wang@sun.com>
parents: 6635
diff changeset
  2320
                if r.dirstate[name] == 'r':
2519976a998b mq: handle added patch renaming correctly
Weijun Wang <weijun.wang@sun.com>
parents: 6635
diff changeset
  2321
                    r.undelete([name])
2519976a998b mq: handle added patch renaming correctly
Weijun Wang <weijun.wang@sun.com>
parents: 6635
diff changeset
  2322
                r.copy(patch, name)
2519976a998b mq: handle added patch renaming correctly
Weijun Wang <weijun.wang@sun.com>
parents: 6635
diff changeset
  2323
                r.remove([patch], False)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  2324
        finally:
8112
6ee71f78497c switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8076
diff changeset
  2325
            wlock.release()
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2326
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2327
    q.save_dirty()
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2328
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2329
def restore(ui, repo, rev, **opts):
10360
bcf90e712dc3 mq: deprecate qsave, qrestore and related options
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10359
diff changeset
  2330
    """restore the queue state saved by a revision (DEPRECATED)
bcf90e712dc3 mq: deprecate qsave, qrestore and related options
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10359
diff changeset
  2331
bcf90e712dc3 mq: deprecate qsave, qrestore and related options
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10359
diff changeset
  2332
    This command is deprecated, use rebase --mq instead."""
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2333
    rev = repo.lookup(rev)
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  2334
    q = repo.mq
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2335
    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
  2336
              qupdate=opts['update'])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2337
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2338
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2339
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2340
def save(ui, repo, **opts):
10360
bcf90e712dc3 mq: deprecate qsave, qrestore and related options
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10359
diff changeset
  2341
    """save current queue state (DEPRECATED)
bcf90e712dc3 mq: deprecate qsave, qrestore and related options
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10359
diff changeset
  2342
bcf90e712dc3 mq: deprecate qsave, qrestore and related options
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10359
diff changeset
  2343
    This command is deprecated, use rebase --mq instead."""
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  2344
    q = repo.mq
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4476
diff changeset
  2345
    message = cmdutil.logmessage(opts)
2694
0fb28dbf0dc7 MQ: uniformise message and logfile option.
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2682
diff changeset
  2346
    ret = q.save(repo, msg=message)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2347
    if ret:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2348
        return ret
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2349
    q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2350
    if opts['copy']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2351
        path = q.path
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2352
        if opts['name']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2353
            newpath = os.path.join(q.basepath, opts['name'])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2354
            if os.path.exists(newpath):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2355
                if not os.path.isdir(newpath):
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
  2356
                    raise util.Abort(_('destination %s exists and is not '
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
  2357
                                       'a directory') % newpath)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2358
                if not opts['force']:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
  2359
                    raise util.Abort(_('destination %s exists, '
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
  2360
                                       'use -f to force') % newpath)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2361
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2362
            newpath = savename(path)
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  2363
        ui.warn(_("copy %s to %s\n") % (path, newpath))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2364
        util.copyfiles(path, newpath)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2365
    if opts['empty']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2366
        try:
2819
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
  2367
            os.unlink(q.join(q.status_path))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2368
        except:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2369
            pass
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2370
    return 0
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2371
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2372
def strip(ui, repo, rev, **opts):
11073
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2373
    """strip a changeset and all its descendants from the repository
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2374
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2375
    The strip command removes all changesets whose local revision
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2376
    number is greater than or equal to REV, and then restores any
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2377
    changesets that are not descendants of REV. If the working
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2378
    directory has uncommitted changes, the operation is aborted unless
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2379
    the --force flag is supplied.
6635
d90d83ebea9e mq: don't update the working copy on strip if parents aren't stripped
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6634
diff changeset
  2380
11073
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2381
    If a parent of the working directory is stripped, then the working
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2382
    directory will automatically be updated to the most recent
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2383
    available ancestor of the stripped parent after the operation
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2384
    completes.
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2385
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2386
    Any stripped changesets are stored in ``.hg/strip-backup`` as a
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2387
    bundle (see ``hg help bundle`` and ``hg help unbundle``). They can
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2388
    be restored by running ``hg unbundle .hg/strip-backup/BUNDLE``,
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2389
    where BUNDLE is the bundle file created by the strip. Note that
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2390
    the local revision numbers will in general be different after the
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2391
    restore.
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2392
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2393
    Use the --nobackup option to discard the backup bundle once the
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2394
    operation completes.
6635
d90d83ebea9e mq: don't update the working copy on strip if parents aren't stripped
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6634
diff changeset
  2395
    """
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2396
    backup = 'all'
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2397
    if opts['backup']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2398
        backup = 'strip'
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2399
    elif opts['nobackup']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2400
        backup = 'none'
6635
d90d83ebea9e mq: don't update the working copy on strip if parents aren't stripped
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6634
diff changeset
  2401
d90d83ebea9e mq: don't update the working copy on strip if parents aren't stripped
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6634
diff changeset
  2402
    rev = repo.lookup(rev)
d90d83ebea9e mq: don't update the working copy on strip if parents aren't stripped
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6634
diff changeset
  2403
    p = repo.dirstate.parents()
d90d83ebea9e mq: don't update the working copy on strip if parents aren't stripped
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6634
diff changeset
  2404
    cl = repo.changelog
d90d83ebea9e mq: don't update the working copy on strip if parents aren't stripped
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6634
diff changeset
  2405
    update = True
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
  2406
    if p[0] == nullid:
6635
d90d83ebea9e mq: don't update the working copy on strip if parents aren't stripped
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6634
diff changeset
  2407
        update = False
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
  2408
    elif p[1] == nullid and rev != cl.ancestor(p[0], rev):
6635
d90d83ebea9e mq: don't update the working copy on strip if parents aren't stripped
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6634
diff changeset
  2409
        update = False
d90d83ebea9e mq: don't update the working copy on strip if parents aren't stripped
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6634
diff changeset
  2410
    elif rev not in (cl.ancestor(p[0], rev), cl.ancestor(p[1], rev)):
d90d83ebea9e mq: don't update the working copy on strip if parents aren't stripped
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6634
diff changeset
  2411
        update = False
d90d83ebea9e mq: don't update the working copy on strip if parents aren't stripped
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6634
diff changeset
  2412
6472
8c4cd80afd3e mq: add --force option to strip
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6382
diff changeset
  2413
    repo.mq.strip(repo, rev, backup=backup, update=update, force=opts['force'])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2414
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2415
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2416
def select(ui, repo, *args, **opts):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2417
    '''set or print guarded patches to push
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2418
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2419
    Use the qguard command to set or print guards on patch, then use
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2420
    qselect to tell mq which guards to use. A patch will be pushed if
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2421
    it has no guards or any positive guards match the currently
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2422
    selected guard, but will not be pushed if any negative guards
9824
87c92b260710 mq: fix literal blocks in docstrings
Martin Geisler <mg@lazybytes.net>
parents: 9733
diff changeset
  2423
    match the current guard. For example::
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2424
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2425
        qguard foo.patch -stable    (negative guard)
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2426
        qguard bar.patch +stable    (positive guard)
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2427
        qselect stable
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2428
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2429
    This activates the "stable" guard. mq will skip foo.patch (because
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2430
    it has a negative match) but push bar.patch (because it has a
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2431
    positive match).
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2432
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2433
    With no arguments, prints the currently active guards.
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2434
    With one argument, sets the active guard.
3223
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3186
diff changeset
  2435
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2436
    Use -n/--none to deactivate guards (no other arguments needed).
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2437
    When no guards are active, patches with positive guards are
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2438
    skipped and patches with negative guards are pushed.
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2439
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2440
    qselect can change the guards on applied patches. It does not pop
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2441
    guarded patches by default. Use --pop to pop back to the last
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2442
    applied patch that is not guarded. Use --reapply (which implies
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2443
    --pop) to push back to the current patch afterwards, but skip
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2444
    guarded patches.
2844
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2445
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2446
    Use -s/--series to print a list of all guards in the series file
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2447
    (no other arguments needed). Use -v for more information.'''
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2448
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2449
    q = repo.mq
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2450
    guards = q.active()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2451
    if args or opts['none']:
2844
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2452
        old_unapplied = q.unapplied(repo)
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2453
        old_guarded = [i for i in xrange(len(q.applied)) if
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2454
                       not q.pushable(i)[0]]
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2455
        q.set_active(args)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2456
        q.save_dirty()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2457
        if not args:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2458
            ui.status(_('guards deactivated\n'))
2844
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2459
        if not opts['pop'] and not opts['reapply']:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2460
            unapplied = q.unapplied(repo)
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2461
            guarded = [i for i in xrange(len(q.applied))
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2462
                       if not q.pushable(i)[0]]
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2463
            if len(unapplied) != len(old_unapplied):
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2464
                ui.status(_('number of unguarded, unapplied patches has '
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2465
                            'changed from %d to %d\n') %
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2466
                          (len(old_unapplied), len(unapplied)))
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2467
            if len(guarded) != len(old_guarded):
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2468
                ui.status(_('number of guarded, applied patches has changed '
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2469
                            'from %d to %d\n') %
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2470
                          (len(old_guarded), len(guarded)))
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2471
    elif opts['series']:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2472
        guards = {}
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2473
        noguards = 0
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2474
        for gs in q.series_guards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2475
            if not gs:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2476
                noguards += 1
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2477
            for g in gs:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2478
                guards.setdefault(g, 0)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2479
                guards[g] += 1
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2480
        if ui.verbose:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2481
            guards['NONE'] = noguards
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2482
        guards = guards.items()
9032
1fa80c5428b8 compat: use 'key' argument instead of 'cmp' when sorting a list
Alejandro Santos <alejolp@alejolp.com>
parents: 9016
diff changeset
  2483
        guards.sort(key=lambda x: x[0][1:])
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2484
        if guards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2485
            ui.note(_('guards in series file:\n'))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2486
            for guard, count in guards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2487
                ui.note('%2d  ' % count)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2488
                ui.write(guard, '\n')
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2489
        else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2490
            ui.note(_('no guards in series file\n'))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2491
    else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2492
        if guards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2493
            ui.note(_('active guards:\n'))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2494
            for g in guards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2495
                ui.write(g, '\n')
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2496
        else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2497
            ui.write(_('no active guards\n'))
2844
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2498
    reapply = opts['reapply'] and q.applied and q.appliedname(-1)
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2499
    popped = False
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2500
    if opts['pop'] or opts['reapply']:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2501
        for i in xrange(len(q.applied)):
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2502
            pushable, reason = q.pushable(i)
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2503
            if not pushable:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2504
                ui.status(_('popping guarded patches\n'))
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2505
                popped = True
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2506
                if i == 0:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2507
                    q.pop(repo, all=True)
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2508
                else:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  2509
                    q.pop(repo, i - 1)
2844
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2510
                break
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2511
    if popped:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2512
        try:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2513
            if reapply:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2514
                ui.status(_('reapplying unguarded patches\n'))
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2515
                q.push(repo, reapply)
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2516
        finally:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2517
            q.save_dirty()
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2518
6645
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  2519
def finish(ui, repo, *revrange, **opts):
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  2520
    """move applied patches into repository history
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  2521
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2522
    Finishes the specified revisions (corresponding to applied
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2523
    patches) by moving them out of mq control into regular repository
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2524
    history.
6645
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  2525
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  2526
    Accepts a revision range or the -a/--applied option. If --applied
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  2527
    is specified, all applied mq revisions are removed from mq
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  2528
    control. Otherwise, the given revisions must be at the base of the
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  2529
    stack of applied patches.
6645
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  2530
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2531
    This can be especially useful if your changes have been applied to
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2532
    an upstream repository, or if you are about to push your changes
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2533
    to upstream.
6645
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  2534
    """
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  2535
    if not opts['applied'] and not revrange:
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  2536
        raise util.Abort(_('no revisions specified'))
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  2537
    elif opts['applied']:
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  2538
        revrange = ('qbase:qtip',) + revrange
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  2539
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  2540
    q = repo.mq
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  2541
    if not q.applied:
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  2542
        ui.status(_('no patches applied\n'))
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  2543
        return 0
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  2544
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  2545
    revs = cmdutil.revrange(repo, revrange)
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  2546
    q.finish(repo, revs)
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  2547
    q.save_dirty()
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  2548
    return 0
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  2549
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2550
def reposetup(ui, repo):
2818
bdc067ff6cf5 Make mq camelcase consistent with the rest of hg.
Brendan Cully <brendan@kublai.com>
parents: 2816
diff changeset
  2551
    class mqrepo(repo.__class__):
8524
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
  2552
        @util.propertycache
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
  2553
        def mq(self):
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
  2554
            return queue(self.ui, self.join(""))
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
  2555
2848
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2845
diff changeset
  2556
        def abort_if_wdir_patched(self, errmsg, force=False):
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2845
diff changeset
  2557
            if self.mq.applied and not force:
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
  2558
                parent = hex(self.dirstate.parents()[0])
2848
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2845
diff changeset
  2559
                if parent in [s.rev for s in self.mq.applied]:
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2845
diff changeset
  2560
                    raise util.Abort(errmsg)
3223
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3186
diff changeset
  2561
8711
1b95c6f13155 mq: fix commit prototype
Matt Mackall <mpm@selenic.com>
parents: 8706
diff changeset
  2562
        def commit(self, text="", user=None, date=None, match=None,
1b95c6f13155 mq: fix commit prototype
Matt Mackall <mpm@selenic.com>
parents: 8706
diff changeset
  2563
                   force=False, editor=False, extra={}):
2848
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2845
diff changeset
  2564
            self.abort_if_wdir_patched(
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2845
diff changeset
  2565
                _('cannot commit over an applied mq patch'),
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2845
diff changeset
  2566
                force)
2845
addd03c7fbfa Disallow commit over an applied mq patch.
Brendan Cully <brendan@kublai.com>
parents: 2844
diff changeset
  2567
8711
1b95c6f13155 mq: fix commit prototype
Matt Mackall <mpm@selenic.com>
parents: 8706
diff changeset
  2568
            return super(mqrepo, self).commit(text, user, date, match, force,
1b95c6f13155 mq: fix commit prototype
Matt Mackall <mpm@selenic.com>
parents: 8706
diff changeset
  2569
                                              editor, extra)
2845
addd03c7fbfa Disallow commit over an applied mq patch.
Brendan Cully <brendan@kublai.com>
parents: 2844
diff changeset
  2570
2848
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2845
diff changeset
  2571
        def push(self, remote, force=False, revs=None):
4040
55578a8d7e84 mq: allow push if -r is given explicitly
Brendan Cully <brendan@kublai.com>
parents: 4037
diff changeset
  2572
            if self.mq.applied and not force and not revs:
2848
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2845
diff changeset
  2573
                raise util.Abort(_('source has mq patches applied'))
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2845
diff changeset
  2574
            return super(mqrepo, self).push(remote, force, revs)
3223
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3186
diff changeset
  2575
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9111
diff changeset
  2576
        def _findtags(self):
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9111
diff changeset
  2577
            '''augment tags from base class with patch tags'''
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9111
diff changeset
  2578
            result = super(mqrepo, self)._findtags()
2682
4e2dc5c16e61 Add mq patch names to tagscache instead of overriding lookup.
Brendan Cully <brendan@kublai.com>
parents: 2677
diff changeset
  2579
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  2580
            q = self.mq
2723
04d9b31faeca mq: do not hold a reference to repo in tags override
Brendan Cully <brendan@kublai.com>
parents: 2720
diff changeset
  2581
            if not q.applied:
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9111
diff changeset
  2582
                return result
2663
96950d39171d Mq: modify repo.lookup to resolve applied patches too.
Brendan Cully <brendan@kublai.com>
parents: 2554
diff changeset
  2583
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
  2584
            mqtags = [(bin(patch.rev), patch.name) for patch in q.applied]
5979
b4858eb4b58f mqrepo: don't abort if the status file has an unknown node
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5534
diff changeset
  2585
b4858eb4b58f mqrepo: don't abort if the status file has an unknown node
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5534
diff changeset
  2586
            if mqtags[-1][0] not in self.changelog.nodemap:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  2587
                self.ui.warn(_('mq status file refers to unknown node %s\n')
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
  2588
                             % short(mqtags[-1][0]))
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9111
diff changeset
  2589
                return result
5979
b4858eb4b58f mqrepo: don't abort if the status file has an unknown node
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5534
diff changeset
  2590
2723
04d9b31faeca mq: do not hold a reference to repo in tags override
Brendan Cully <brendan@kublai.com>
parents: 2720
diff changeset
  2591
            mqtags.append((mqtags[-1][0], 'qtip'))
04d9b31faeca mq: do not hold a reference to repo in tags override
Brendan Cully <brendan@kublai.com>
parents: 2720
diff changeset
  2592
            mqtags.append((mqtags[0][0], 'qbase'))
4219
6cb5be6bd70f mq: add qparent tag (first parent of qbase)
Brendan Cully <brendan@kublai.com>
parents: 4209
diff changeset
  2593
            mqtags.append((self.changelog.parents(mqtags[0][0])[0], 'qparent'))
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9111
diff changeset
  2594
            tags = result[0]
2723
04d9b31faeca mq: do not hold a reference to repo in tags override
Brendan Cully <brendan@kublai.com>
parents: 2720
diff changeset
  2595
            for patch in mqtags:
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9111
diff changeset
  2596
                if patch[1] in tags:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  2597
                    self.ui.warn(_('Tag %s overrides mq patch of the same name\n')
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  2598
                                 % patch[1])
2723
04d9b31faeca mq: do not hold a reference to repo in tags override
Brendan Cully <brendan@kublai.com>
parents: 2720
diff changeset
  2599
                else:
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9111
diff changeset
  2600
                    tags[patch[1]] = patch[0]
2682
4e2dc5c16e61 Add mq patch names to tagscache instead of overriding lookup.
Brendan Cully <brendan@kublai.com>
parents: 2677
diff changeset
  2601
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9111
diff changeset
  2602
            return result
2664
9b8df8dceeed Add qtip and qbase to mq qlookup.
Brendan Cully <brendan@kublai.com>
parents: 2663
diff changeset
  2603
6120
f89878df40fe move the reading of branch.cache from _branchtags to branchtags
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6048
diff changeset
  2604
        def _branchtags(self, partial, lrev):
3492
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3473
diff changeset
  2605
            q = self.mq
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3473
diff changeset
  2606
            if not q.applied:
6120
f89878df40fe move the reading of branch.cache from _branchtags to branchtags
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6048
diff changeset
  2607
                return super(mqrepo, self)._branchtags(partial, lrev)
3492
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3473
diff changeset
  2608
5979
b4858eb4b58f mqrepo: don't abort if the status file has an unknown node
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5534
diff changeset
  2609
            cl = self.changelog
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
  2610
            qbasenode = bin(q.applied[0].rev)
5979
b4858eb4b58f mqrepo: don't abort if the status file has an unknown node
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5534
diff changeset
  2611
            if qbasenode not in cl.nodemap:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  2612
                self.ui.warn(_('mq status file refers to unknown node %s\n')
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
  2613
                             % short(qbasenode))
6120
f89878df40fe move the reading of branch.cache from _branchtags to branchtags
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6048
diff changeset
  2614
                return super(mqrepo, self)._branchtags(partial, lrev)
3492
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3473
diff changeset
  2615
5979
b4858eb4b58f mqrepo: don't abort if the status file has an unknown node
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5534
diff changeset
  2616
            qbase = cl.rev(qbasenode)
3492
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3473
diff changeset
  2617
            start = lrev + 1
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3473
diff changeset
  2618
            if start < qbase:
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3473
diff changeset
  2619
                # update the cache (excluding the patches) and save it
10770
fe39f0160c74 localrepo: change _updatebranchcache to use a context generator
Sune Foldager <cryo@cyanite.org>
parents: 10755
diff changeset
  2620
                ctxgen = (self[r] for r in xrange(lrev + 1, qbase))
fe39f0160c74 localrepo: change _updatebranchcache to use a context generator
Sune Foldager <cryo@cyanite.org>
parents: 10755
diff changeset
  2621
                self._updatebranchcache(partial, ctxgen)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  2622
                self._writebranchcache(partial, cl.node(qbase - 1), qbase - 1)
3492
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3473
diff changeset
  2623
                start = qbase
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3473
diff changeset
  2624
            # if start = qbase, the cache is as updated as it should be.
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3473
diff changeset
  2625
            # if start > qbase, the cache includes (part of) the patches.
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3473
diff changeset
  2626
            # we might as well use it, but we won't save it.
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3473
diff changeset
  2627
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3473
diff changeset
  2628
            # update the cache up to the tip
10770
fe39f0160c74 localrepo: change _updatebranchcache to use a context generator
Sune Foldager <cryo@cyanite.org>
parents: 10755
diff changeset
  2629
            ctxgen = (self[r] for r in xrange(start, len(cl)))
fe39f0160c74 localrepo: change _updatebranchcache to use a context generator
Sune Foldager <cryo@cyanite.org>
parents: 10755
diff changeset
  2630
            self._updatebranchcache(partial, ctxgen)
3492
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3473
diff changeset
  2631
3826
b3b868113d24 fix encoding conversion of branch names when mq is loaded
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3763
diff changeset
  2632
            return partial
3492
fbf8320f25c8 make mq play nicely with the branch cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3473
diff changeset
  2633
2851
82f50658c72b mq: only add mq attribute to local repo
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2850
diff changeset
  2634
    if repo.local():
82f50658c72b mq: only add mq attribute to local repo
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2850
diff changeset
  2635
        repo.__class__ = mqrepo
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2636
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
  2637
def mqimport(orig, ui, repo, *args, **kwargs):
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  2638
    if (hasattr(repo, 'abort_if_wdir_patched')
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  2639
        and not kwargs.get('no_commit', False)):
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
  2640
        repo.abort_if_wdir_patched(_('cannot import over an applied patch'),
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
  2641
                                   kwargs.get('force'))
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
  2642
    return orig(ui, repo, *args, **kwargs)
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
  2643
10402
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  2644
def mqinit(orig, ui, *args, **kwargs):
10558
6505773080e4 mq: simplify --mq handling / keep compatibility with other extensions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10510
diff changeset
  2645
    mq = kwargs.pop('mq', None)
10402
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  2646
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  2647
    if not mq:
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  2648
        return orig(ui, *args, **kwargs)
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  2649
10691
a778a367c20b mq: fix init with nonexistent or non-local repository
Cédric Duval <cedricduval@free.fr>
parents: 10690
diff changeset
  2650
    if args:
a778a367c20b mq: fix init with nonexistent or non-local repository
Cédric Duval <cedricduval@free.fr>
parents: 10690
diff changeset
  2651
        repopath = args[0]
a778a367c20b mq: fix init with nonexistent or non-local repository
Cédric Duval <cedricduval@free.fr>
parents: 10690
diff changeset
  2652
        if not hg.islocal(repopath):
a778a367c20b mq: fix init with nonexistent or non-local repository
Cédric Duval <cedricduval@free.fr>
parents: 10690
diff changeset
  2653
            raise util.Abort(_('only a local queue repository '
a778a367c20b mq: fix init with nonexistent or non-local repository
Cédric Duval <cedricduval@free.fr>
parents: 10690
diff changeset
  2654
                               'may be initialized'))
a778a367c20b mq: fix init with nonexistent or non-local repository
Cédric Duval <cedricduval@free.fr>
parents: 10690
diff changeset
  2655
    else:
a778a367c20b mq: fix init with nonexistent or non-local repository
Cédric Duval <cedricduval@free.fr>
parents: 10690
diff changeset
  2656
        repopath = cmdutil.findrepo(os.getcwd())
a778a367c20b mq: fix init with nonexistent or non-local repository
Cédric Duval <cedricduval@free.fr>
parents: 10690
diff changeset
  2657
        if not repopath:
a778a367c20b mq: fix init with nonexistent or non-local repository
Cédric Duval <cedricduval@free.fr>
parents: 10690
diff changeset
  2658
            raise util.Abort(_('There is no Mercurial repository here '
a778a367c20b mq: fix init with nonexistent or non-local repository
Cédric Duval <cedricduval@free.fr>
parents: 10690
diff changeset
  2659
                               '(.hg not found)'))
10402
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  2660
    repo = hg.repository(ui, repopath)
10480
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  2661
    return qinit(ui, repo, True)
10402
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  2662
10359
ec02cf8d1628 mq: add --mq option to some commands
Brendan Cully <brendan@kublai.com>
parents: 10282
diff changeset
  2663
def mqcommand(orig, ui, repo, *args, **kwargs):
ec02cf8d1628 mq: add --mq option to some commands
Brendan Cully <brendan@kublai.com>
parents: 10282
diff changeset
  2664
    """Add --mq option to operate on patch repository instead of main"""
ec02cf8d1628 mq: add --mq option to some commands
Brendan Cully <brendan@kublai.com>
parents: 10282
diff changeset
  2665
ec02cf8d1628 mq: add --mq option to some commands
Brendan Cully <brendan@kublai.com>
parents: 10282
diff changeset
  2666
    # some commands do not like getting unknown options
10558
6505773080e4 mq: simplify --mq handling / keep compatibility with other extensions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10510
diff changeset
  2667
    mq = kwargs.pop('mq', None)
10359
ec02cf8d1628 mq: add --mq option to some commands
Brendan Cully <brendan@kublai.com>
parents: 10282
diff changeset
  2668
ec02cf8d1628 mq: add --mq option to some commands
Brendan Cully <brendan@kublai.com>
parents: 10282
diff changeset
  2669
    if not mq:
ec02cf8d1628 mq: add --mq option to some commands
Brendan Cully <brendan@kublai.com>
parents: 10282
diff changeset
  2670
        return orig(ui, repo, *args, **kwargs)
ec02cf8d1628 mq: add --mq option to some commands
Brendan Cully <brendan@kublai.com>
parents: 10282
diff changeset
  2671
ec02cf8d1628 mq: add --mq option to some commands
Brendan Cully <brendan@kublai.com>
parents: 10282
diff changeset
  2672
    q = repo.mq
ec02cf8d1628 mq: add --mq option to some commands
Brendan Cully <brendan@kublai.com>
parents: 10282
diff changeset
  2673
    r = q.qrepo()
ec02cf8d1628 mq: add --mq option to some commands
Brendan Cully <brendan@kublai.com>
parents: 10282
diff changeset
  2674
    if not r:
ec02cf8d1628 mq: add --mq option to some commands
Brendan Cully <brendan@kublai.com>
parents: 10282
diff changeset
  2675
        raise util.Abort('no queue repository')
10407
2e8926e9cc32 mq: incorporate mq repo config when using --mq
Brendan Cully <brendan@kublai.com>
parents: 10402
diff changeset
  2676
    return orig(r.ui, r, *args, **kwargs)
10359
ec02cf8d1628 mq: add --mq option to some commands
Brendan Cully <brendan@kublai.com>
parents: 10282
diff changeset
  2677
7142
88f1b8081f1c Prevent import over an applied patch (closes issue795)
Brendan Cully <brendan@kublai.com>
parents: 7113
diff changeset
  2678
def uisetup(ui):
10591
ff2704a8ded3 mq: drop -Q in favor of --mq only
Matt Mackall <mpm@selenic.com>
parents: 10589
diff changeset
  2679
    mqopt = [('', 'mq', None, _("operate on patch repository"))]
10402
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  2680
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
  2681
    extensions.wrapcommand(commands.table, 'import', mqimport)
10402
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  2682
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  2683
    entry = extensions.wrapcommand(commands.table, 'init', mqinit)
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  2684
    entry[1].extend(mqopt)
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  2685
10796
ce2ae8bf3ae3 Add missing --mq option to hg log.
Michael Glassford <glassfordmjg@gmail.com>
parents: 10770
diff changeset
  2686
    norepo = commands.norepo.split(" ")
10498
dc9a803c1800 mq: iterate over a copy of the command table keys (fixes issue2045).
Brendan Cully <brendan@kublai.com>
parents: 10480
diff changeset
  2687
    for cmd in commands.table.keys():
10401
6252852b4332 mq: add -Q option to all commands not in norepo
Brendan Cully <brendan@kublai.com>
parents: 10397
diff changeset
  2688
        cmd = cmdutil.parsealiases(cmd)[0]
10796
ce2ae8bf3ae3 Add missing --mq option to hg log.
Michael Glassford <glassfordmjg@gmail.com>
parents: 10770
diff changeset
  2689
        if cmd in norepo:
10401
6252852b4332 mq: add -Q option to all commands not in norepo
Brendan Cully <brendan@kublai.com>
parents: 10397
diff changeset
  2690
            continue
10359
ec02cf8d1628 mq: add --mq option to some commands
Brendan Cully <brendan@kublai.com>
parents: 10282
diff changeset
  2691
        entry = extensions.wrapcommand(commands.table, cmd, mqcommand)
10402
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  2692
        entry[1].extend(mqopt)
7142
88f1b8081f1c Prevent import over an applied patch (closes issue795)
Brendan Cully <brendan@kublai.com>
parents: 7113
diff changeset
  2693
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  2694
seriesopts = [('s', 'summary', None, _('print first line of patch header'))]
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  2695
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2696
cmdtable = {
9364
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  2697
    "qapplied":
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  2698
        (applied,
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  2699
         [('1', 'last', None, _('show only the last patch'))] + seriesopts,
9438
b2f3b9c82ac0 Add new flag [-1] to synopsis of qapplied/qunapplied
Thomas Arendsen Hein <thomas@intevation.de>
parents: 9375
diff changeset
  2700
         _('hg qapplied [-1] [-s] [PATCH]')),
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2701
    "qclone":
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2702
        (clone,
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2703
         [('', 'pull', None, _('use pull protocol to copy metadata')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2704
          ('U', 'noupdate', None, _('do not update the new working directories')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2705
          ('', 'uncompressed', None,
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2706
           _('use uncompressed transfer (fast over LAN)')),
8027
9c7ca86fc658 expand "repo" to "repository" in help texts
Martin Geisler <mg@lazybytes.net>
parents: 8026
diff changeset
  2707
          ('p', 'patches', '', _('location of source patch repository')),
5147
c80af96943aa refactor options from cmdtable
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 5053
diff changeset
  2708
         ] + commands.remoteopts,
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2709
         _('hg qclone [OPTION]... SOURCE [DEST]')),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2710
    "qcommit|qci":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2711
        (commit,
2185
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
  2712
         commands.table["^commit|ci"][1],
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2713
         _('hg qcommit [OPTION]... [FILE]...')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2714
    "^qdiff":
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2715
        (diff,
6668
034f444902d9 mq: qdiff: support all diffopts
Jason Orendorff <jorendorff@mozilla.com>
parents: 6650
diff changeset
  2716
         commands.diffopts + commands.diffopts2 + commands.walkopts,
034f444902d9 mq: qdiff: support all diffopts
Jason Orendorff <jorendorff@mozilla.com>
parents: 6650
diff changeset
  2717
         _('hg qdiff [OPTION]... [FILE]...')),
2904
57b88b86a845 Replace qdel/qfold -f option with -k/--keep.
Brendan Cully <brendan@kublai.com>
parents: 2883
diff changeset
  2718
    "qdelete|qremove|qrm":
2752
5dfeda163bb7 Add -f option to qdelete, to remove patch file.
Brendan Cully <brendan@kublai.com>
parents: 2751
diff changeset
  2719
        (delete,
3373
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
  2720
         [('k', 'keep', None, _('keep patch file')),
8904
8be38b624902 mq: no longer mention the deprecated qdelete's --revision option
Cédric Duval <cedricduval@free.fr>
parents: 8894
diff changeset
  2721
          ('r', 'rev', [], _('stop managing a revision (DEPRECATED)'))],
4737
2ececafa5859 mq: more qdelete help text tweaks
Brendan Cully <brendan@kublai.com>
parents: 4736
diff changeset
  2722
         _('hg qdelete [-k] [-r REV]... [PATCH]...')),
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2723
    'qfold':
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2724
        (fold,
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2725
         [('e', 'edit', None, _('edit patch header')),
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2726
          ('k', 'keep', None, _('keep folded patch files')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2727
         ] + commands.commitopts,
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2728
         _('hg qfold [-e] [-k] [-m TEXT] [-l FILE] PATCH...')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2729
    'qgoto':
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2730
        (goto,
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2731
         [('f', 'force', None, _('overwrite any local changes'))],
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2732
         _('hg qgoto [OPTION]... PATCH')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2733
    'qguard':
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2734
        (guard,
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2735
         [('l', 'list', None, _('list all patches and guards')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2736
          ('n', 'none', None, _('drop all guards'))],
10476
3113736dbac5 mq: more instructive use of "--" in qguard help (issue2040)
Martin Geisler <mg@lazybytes.net>
parents: 10413
diff changeset
  2737
         _('hg qguard [-l] [-n] [PATCH] [-- [+GUARD]... [-GUARD]...]')),
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2738
    'qheader': (header, [], _('hg qheader [PATCH]')),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2739
    "^qimport":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2740
        (qimport,
8026
683d8ebcf434 expand "dir" to "directory" in help texts
Martin Geisler <mg@lazybytes.net>
parents: 7994
diff changeset
  2741
         [('e', 'existing', None, _('import file in patch directory')),
8761
0289f384e1e5 Generally replace "file name" with "filename" in help and comments.
timeless <timeless@gmail.com>
parents: 8760
diff changeset
  2742
          ('n', 'name', '', _('name of patch file')),
7002
07c8396fa001 i18n, mq: mark command line options for translation
Martin Geisler <mg@daimi.au.dk>
parents: 6960
diff changeset
  2743
          ('f', 'force', None, _('overwrite existing files')),
07c8396fa001 i18n, mq: mark command line options for translation
Martin Geisler <mg@daimi.au.dk>
parents: 6960
diff changeset
  2744
          ('r', 'rev', [], _('place existing revisions under mq control')),
8362
bbc74c05b8a4 mq: add -P/--push option to qimport
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8288
diff changeset
  2745
          ('g', 'git', None, _('use git extended diff format')),
bbc74c05b8a4 mq: add -P/--push option to qimport
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8288
diff changeset
  2746
          ('P', 'push', None, _('qpush after importing'))],
bbc74c05b8a4 mq: add -P/--push option to qimport
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8288
diff changeset
  2747
         _('hg qimport [-e] [-n NAME] [-f] [-g] [-P] [-r REV]... FILE...')),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2748
    "^qinit":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2749
        (init,
7002
07c8396fa001 i18n, mq: mark command line options for translation
Martin Geisler <mg@daimi.au.dk>
parents: 6960
diff changeset
  2750
         [('c', 'create-repo', None, _('create queue repository'))],
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2751
         _('hg qinit [-c]')),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2752
    "qnew":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2753
        (new,
2939
abd0be815c9c Add qnew -e option.
Brendan Cully <brendan@kublai.com>
parents: 2938
diff changeset
  2754
         [('e', 'edit', None, _('edit commit message')),
10382
e54e3f6e6789 mq: fix deprecation mention, line length
Augie Fackler <durin42@gmail.com>
parents: 10372
diff changeset
  2755
          ('f', 'force', None, _('import uncommitted changes (DEPRECATED)')),
5025
7041869a1bf6 mq: add qnew --git option
Patrick Mezard <pmezard@gmail.com>
parents: 4970
diff changeset
  2756
          ('g', 'git', None, _('use git extended diff format')),
6915
ef14c773b3d6 mq: fix docs for qrefresh -D (issue1234)
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 6801
diff changeset
  2757
          ('U', 'currentuser', None, _('add "From: <current user>" to patch')),
ef14c773b3d6 mq: fix docs for qrefresh -D (issue1234)
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 6801
diff changeset
  2758
          ('u', 'user', '', _('add "From: <given user>" to patch')),
ef14c773b3d6 mq: fix docs for qrefresh -D (issue1234)
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 6801
diff changeset
  2759
          ('D', 'currentdate', None, _('add "Date: <current date>" to patch')),
ef14c773b3d6 mq: fix docs for qrefresh -D (issue1234)
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 6801
diff changeset
  2760
          ('d', 'date', '', _('add "Date: <given date>" to patch'))
ef14c773b3d6 mq: fix docs for qrefresh -D (issue1234)
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 6801
diff changeset
  2761
          ] + commands.walkopts + commands.commitopts,
10947
ede19417c3c4 mq: Remove -f from qnew command syntax.
Isaac Jurado <diptongo@gmail.com>
parents: 10946
diff changeset
  2762
         _('hg qnew [-e] [-m TEXT] [-l FILE] PATCH [FILE]...')),
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2763
    "qnext": (next, [] + seriesopts, _('hg qnext [-s]')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2764
    "qprev": (prev, [] + seriesopts, _('hg qprev [-s]')),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2765
    "^qpop":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2766
        (pop,
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2767
         [('a', 'all', None, _('pop all patches')),
10360
bcf90e712dc3 mq: deprecate qsave, qrestore and related options
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10359
diff changeset
  2768
          ('n', 'name', '', _('queue name to pop (DEPRECATED)')),
9588
a9d1e7c8160e mq: changed help for qpop -f to reflect actual behaviour
Stephen Rasku <mercurial@srasku.net>
parents: 9287
diff changeset
  2769
          ('f', 'force', None, _('forget any local changes to patched files'))],
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2770
         _('hg qpop [-a] [-n NAME] [-f] [PATCH | INDEX]')),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2771
    "^qpush":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2772
        (push,
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2773
         [('f', 'force', None, _('apply if the patch has rejects')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2774
          ('l', 'list', None, _('list patch name in commit text')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2775
          ('a', 'all', None, _('apply all patches')),
10360
bcf90e712dc3 mq: deprecate qsave, qrestore and related options
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10359
diff changeset
  2776
          ('m', 'merge', None, _('merge from another queue (DEPRECATED)')),
bcf90e712dc3 mq: deprecate qsave, qrestore and related options
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10359
diff changeset
  2777
          ('n', 'name', '', _('merge queue name (DEPRECATED)'))],
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2778
         _('hg qpush [-f] [-l] [-a] [-m] [-n NAME] [PATCH | INDEX]')),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2779
    "^qrefresh":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2780
        (refresh,
2746
0503eb5c0a33 Add option -e/--edit to qrefresh, to edit the existing header.
Brendan Cully <brendan@kublai.com>
parents: 2745
diff changeset
  2781
         [('e', 'edit', None, _('edit commit message')),
3086
17747e80ea6c mq: Add --git option to qrefresh
Brendan Cully <brendan@kublai.com>
parents: 3085
diff changeset
  2782
          ('g', 'git', None, _('use git extended diff format')),
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  2783
          ('s', 'short', None,
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  2784
           _('refresh only files already in the patch and specified files')),
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  2785
          ('U', 'currentuser', None,
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  2786
           _('add/update author field in patch with current user')),
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  2787
          ('u', 'user', '',
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  2788
           _('add/update author field in patch with given user')),
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  2789
          ('D', 'currentdate', None,
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  2790
           _('add/update date field in patch with current date')),
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  2791
          ('d', 'date', '',
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  2792
           _('add/update date field in patch with given date'))
6915
ef14c773b3d6 mq: fix docs for qrefresh -D (issue1234)
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 6801
diff changeset
  2793
          ] + commands.walkopts + commands.commitopts,
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2794
         _('hg qrefresh [-I] [-X] [-e] [-m TEXT] [-l FILE] [-s] [FILE]...')),
2751
7d1de4545728 mq: add qmv as alias for qrename
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2750
diff changeset
  2795
    'qrename|qmv':
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2796
        (rename, [], _('hg qrename PATCH1 [PATCH2]')),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2797
    "qrestore":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2798
        (restore,
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2799
         [('d', 'delete', None, _('delete save entry')),
8026
683d8ebcf434 expand "dir" to "directory" in help texts
Martin Geisler <mg@lazybytes.net>
parents: 7994
diff changeset
  2800
          ('u', 'update', None, _('update queue working directory'))],
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2801
         _('hg qrestore [-d] [-u] REV')),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2802
    "qsave":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2803
        (save,
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2804
         [('c', 'copy', None, _('copy patch directory')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2805
          ('n', 'name', '', _('copy directory name')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2806
          ('e', 'empty', None, _('clear queue status file')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2807
          ('f', 'force', None, _('force copy'))] + commands.commitopts,
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2808
         _('hg qsave [-m TEXT] [-l FILE] [-c] [-n NAME] [-e] [-f]')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2809
    "qselect":
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2810
        (select,
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2811
         [('n', 'none', None, _('disable all guards')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2812
          ('s', 'series', None, _('list all guards in series file')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2813
          ('', 'pop', None, _('pop to before first guarded applied patch')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2814
          ('', 'reapply', None, _('pop, then reapply patches'))],
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2815
         _('hg qselect [OPTION]... [GUARD]...')),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2816
    "qseries":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2817
        (series,
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2818
         [('m', 'missing', None, _('print patches not in series')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4722
diff changeset
  2819
         ] + seriesopts,
11073
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2820
          _('hg qseries [-ms]')),
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2821
     "^strip":
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2822
         (strip,
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2823
         [('f', 'force', None, _('force removal of changesets even if the '
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2824
                                 'working directory has uncommitted changes')),
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2825
          ('b', 'backup', None, _('bundle only changesets with local revision'
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2826
                                  ' number greater than REV which are not'
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2827
                                  ' descendants of REV (DEPRECATED)')),
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2828
           ('n', 'nobackup', None, _('no backups'))],
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2829
          _('hg strip [-f] [-b] [-n] REV')),
ee5b112aa529 mq: rewrite strip docstrings
Faheem Mitha <faheem@email.unc.edu>
parents: 10947
diff changeset
  2830
     "qtop": (top, [] + seriesopts, _('hg qtop [-s]')),
9364
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  2831
    "qunapplied":
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  2832
        (unapplied,
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  2833
         [('1', 'first', None, _('show only the first patch'))] + seriesopts,
9438
b2f3b9c82ac0 Add new flag [-1] to synopsis of qapplied/qunapplied
Thomas Arendsen Hein <thomas@intevation.de>
parents: 9375
diff changeset
  2834
         _('hg qunapplied [-1] [-s] [PATCH]')),
6645
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  2835
    "qfinish":
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  2836
        (finish,
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  2837
         [('a', 'applied', None, _('finish all applied changesets'))],
8948
aa0fe57d4abe mq: standardize qfinish cmdline help string
Martin Geisler <mg@lazybytes.net>
parents: 8932
diff changeset
  2838
         _('hg qfinish [-a] [REV]...')),
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2839
}