hgext/mq.py
author FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
Wed, 19 Mar 2014 01:07:41 +0900
branchstable
changeset 20768 57d0c8c3b947
parent 20119 1648e44edd8d
child 20769 1e686e55780c
permissions -rw-r--r--
qnew: save manually edited commit message into ".hg/last-message.txt" Before this patch, manually edited commit message for "hg qnew -e" isn't saved into ".hg/last-message.txt" until it is saved by "localrepository.savecommitmessage()" in "localrepository.commit()". This may lose such commit message, if unexpected exception is raised. This patch saves manually edited commit message for "hg qnew -e" into ".hg/last-message.txt" just after user editing. This patch doesn't save the message specified by -m/-l options as same as other commands. This is the simplest implementation to fix on stable. Editing and saving commit message should be centralized into the framework of "localrepository.commit()" with "editor" argument in the future. This patch uses repository wrapping class for exception raising before saving commit message in "localrepository.commit()" easily and certainly, because such exception requires corner case condition.
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
10973
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10962
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.
11234
1ebe048902d9 mq: mention qqueue in module docstring
Martin Geisler <mg@lazybytes.net>
parents: 11230
diff changeset
    40
16040
c0b2986b37b8 mq: fix secret description in help
Matt Mackall <mpm@selenic.com>
parents: 16029
diff changeset
    41
It may be desirable for mq changesets to be kept in the secret phase (see
16017
2605fc990725 mq: add secret setting
Matt Mackall <mpm@selenic.com>
parents: 15972
diff changeset
    42
:hg:`help phases`), which can be enabled with the following setting::
2605fc990725 mq: add secret setting
Matt Mackall <mpm@selenic.com>
parents: 15972
diff changeset
    43
2605fc990725 mq: add secret setting
Matt Mackall <mpm@selenic.com>
parents: 15972
diff changeset
    44
  [mq]
2605fc990725 mq: add secret setting
Matt Mackall <mpm@selenic.com>
parents: 15972
diff changeset
    45
  secret = True
2605fc990725 mq: add secret setting
Matt Mackall <mpm@selenic.com>
parents: 15972
diff changeset
    46
11234
1ebe048902d9 mq: mention qqueue in module docstring
Martin Geisler <mg@lazybytes.net>
parents: 11230
diff changeset
    47
You will by default be managing a patch queue named "patches". You can
1ebe048902d9 mq: mention qqueue in module docstring
Martin Geisler <mg@lazybytes.net>
parents: 11230
diff changeset
    48
create other, independent patch queues with the :hg:`qqueue` command.
16656
4ae3ba9e4d7a mq: introduce mq.check setting
Patrick Mezard <patrick@mezard.eu>
parents: 16655
diff changeset
    49
4ae3ba9e4d7a mq: introduce mq.check setting
Patrick Mezard <patrick@mezard.eu>
parents: 16655
diff changeset
    50
If the working directory contains uncommitted files, qpush, qpop and
4ae3ba9e4d7a mq: introduce mq.check setting
Patrick Mezard <patrick@mezard.eu>
parents: 16655
diff changeset
    51
qgoto abort immediately. If -f/--force is used, the changes are
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
    52
discarded. Setting::
16656
4ae3ba9e4d7a mq: introduce mq.check setting
Patrick Mezard <patrick@mezard.eu>
parents: 16655
diff changeset
    53
4ae3ba9e4d7a mq: introduce mq.check setting
Patrick Mezard <patrick@mezard.eu>
parents: 16655
diff changeset
    54
  [mq]
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
    55
  keepchanges = True
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
    56
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
    57
make them behave as if --keep-changes were passed, and non-conflicting
16656
4ae3ba9e4d7a mq: introduce mq.check setting
Patrick Mezard <patrick@mezard.eu>
parents: 16655
diff changeset
    58
local changes will be tolerated and preserved. If incompatible options
4ae3ba9e4d7a mq: introduce mq.check setting
Patrick Mezard <patrick@mezard.eu>
parents: 16655
diff changeset
    59
such as -f/--force or --exact are passed, this setting is ignored.
19826
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
    60
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
    61
This extension used to provide a strip command. This command now lives
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
    62
in the strip extension.
2554
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    63
'''
8264c2034970 help: add help to mq extension
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2531
diff changeset
    64
3891
6b4127c7d52a Simplify i18n imports
Matt Mackall <mpm@selenic.com>
parents: 3877
diff changeset
    65
from mercurial.i18n import _
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
    66
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
    67
from mercurial.lock import release
14241
45f7aa35f2fd mq: don't hide the patch module
Idan Kamara <idankk86@gmail.com>
parents: 14239
diff changeset
    68
from mercurial import commands, cmdutil, hg, scmutil, util, revset
19826
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
    69
from mercurial import extensions, error, phases
14241
45f7aa35f2fd mq: don't hide the patch module
Idan Kamara <idankk86@gmail.com>
parents: 14239
diff changeset
    70
from mercurial import patch as patchmod
19395
19622224559b mq: use an unfiltered property cache for the queue object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19212
diff changeset
    71
from mercurial import localrepo
19638
20096384754f mq: update subrepos when applying / unapplying patches that change .hgsubstate
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19636
diff changeset
    72
from mercurial import subrepo
14636
b98063487a6f mq: use ui.fin when importing patch from '-'
Idan Kamara <idankk86@gmail.com>
parents: 14635
diff changeset
    73
import os, re, errno, shutil
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
    74
5645
1f044b04fa0a mq: drop obsolete reference to 'qversion'
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 5534
diff changeset
    75
commands.norepo += " qclone"
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
    76
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
    77
seriesopts = [('s', 'summary', None, _('print first line of patch header'))]
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
    78
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
    79
cmdtable = {}
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
    80
command = cmdutil.command(cmdtable)
16743
38caf405d010 hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents: 16733
diff changeset
    81
testedwith = 'internal'
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
    82
19951
d51c4d85ec23 spelling: random spell checker fixes
Mads Kiilerich <madski@unity3d.com>
parents: 19916
diff changeset
    83
# force load strip extension formerly included in mq and import some utility
19822
a194a33f8cb2 mq: prepare a strip extension for extraction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19820
diff changeset
    84
try:
a194a33f8cb2 mq: prepare a strip extension for extraction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19820
diff changeset
    85
    stripext = extensions.find('strip')
a194a33f8cb2 mq: prepare a strip extension for extraction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19820
diff changeset
    86
except KeyError:
a194a33f8cb2 mq: prepare a strip extension for extraction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19820
diff changeset
    87
    # note: load is lazy so we could avoid the try-except,
19951
d51c4d85ec23 spelling: random spell checker fixes
Mads Kiilerich <madski@unity3d.com>
parents: 19916
diff changeset
    88
    # but I (marmoute) prefer this explicit code.
19822
a194a33f8cb2 mq: prepare a strip extension for extraction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19820
diff changeset
    89
    class dummyui(object):
a194a33f8cb2 mq: prepare a strip extension for extraction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19820
diff changeset
    90
        def debug(self, msg):
a194a33f8cb2 mq: prepare a strip extension for extraction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19820
diff changeset
    91
            pass
a194a33f8cb2 mq: prepare a strip extension for extraction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19820
diff changeset
    92
    stripext = extensions.load(dummyui(), 'strip', '')
a194a33f8cb2 mq: prepare a strip extension for extraction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19820
diff changeset
    93
19825
4b4997068143 strip: move the strip helper function for mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19824
diff changeset
    94
strip = stripext.strip
19823
6fb14d21fe9d strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19822
diff changeset
    95
checksubstate = stripext.checksubstate
19824
237e40b2c1ff strip: move checklocalchanges from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19823
diff changeset
    96
checklocalchanges = stripext.checklocalchanges
237e40b2c1ff strip: move checklocalchanges from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19823
diff changeset
    97
19823
6fb14d21fe9d strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19822
diff changeset
    98
4037
bbdba01cce28 Enforce unixish style for all generated patch names.
Patrick Mezard <pmezard@gmail.com>
parents: 4016
diff changeset
    99
# 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
   100
# 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
   101
normname = util.normpath
bbdba01cce28 Enforce unixish style for all generated patch names.
Patrick Mezard <pmezard@gmail.com>
parents: 4016
diff changeset
   102
8778
c5f36402daad use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8761
diff changeset
   103
class statusentry(object):
10682
8ed350051896 mq: simplify statusentry(), fix restore broken by ee48e5ef8753
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10681
diff changeset
   104
    def __init__(self, node, name):
8ed350051896 mq: simplify statusentry(), fix restore broken by ee48e5ef8753
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10681
diff changeset
   105
        self.node, self.name = node, name
11375
0f33abfccaa1 mq: __str__ falls back to __repr__
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11365
diff changeset
   106
    def __repr__(self):
10678
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10663
diff changeset
   107
        return hex(self.node) + ':' + self.name
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
   108
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   109
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
   110
    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
   111
        def eatdiff(lines):
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   112
            while lines:
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   113
                l = lines[-1]
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   114
                if (l.startswith("diff -") or
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   115
                    l.startswith("Index:") or
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   116
                    l.startswith("===========")):
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   117
                    del lines[-1]
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   118
                else:
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   119
                    break
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   120
        def eatempty(lines):
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   121
            while lines:
10688
d4d3a8a65248 mq: don't use regexp when not necessary
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10687
diff changeset
   122
                if not lines[-1].strip():
8653
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   123
                    del lines[-1]
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   124
                else:
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   125
                    break
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   126
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   127
        message = []
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   128
        comments = []
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   129
        user = None
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   130
        date = None
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   131
        parent = None
8653
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   132
        format = None
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   133
        subject = None
13229
f3058dd05281 mq: record more data in patchheader class (no behavior changes)
Steve Borho <steve@borho.org>
parents: 13228
diff changeset
   134
        branch = None
f3058dd05281 mq: record more data in patchheader class (no behavior changes)
Steve Borho <steve@borho.org>
parents: 13228
diff changeset
   135
        nodeid = None
8653
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   136
        diffstart = 0
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   137
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   138
        for line in file(pf):
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   139
            line = line.rstrip()
10730
4d6bd7b8b6d8 mq: allow lines starting with '--- ' in patch messages
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10691
diff changeset
   140
            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
   141
                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
   142
                diffstart = 2
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   143
                break
10730
4d6bd7b8b6d8 mq: allow lines starting with '--- ' in patch messages
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10691
diff changeset
   144
            diffstart = 0 # reset
8653
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   145
            if line.startswith("--- "):
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   146
                diffstart = 1
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   147
                continue
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   148
            elif format == "hgpatch":
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   149
                # 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
   150
                if line.startswith("# User "):
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   151
                    user = line[7:]
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   152
                elif line.startswith("# Date "):
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   153
                    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
   154
                elif line.startswith("# Parent "):
14170
31ec4d7eb63f mq: strip extra whitespace from node ids in header (issue2790)
Kevin Bullock <kbullock@ringworld.org>
parents: 14051
diff changeset
   155
                    parent = line[9:].lstrip()
13229
f3058dd05281 mq: record more data in patchheader class (no behavior changes)
Steve Borho <steve@borho.org>
parents: 13228
diff changeset
   156
                elif line.startswith("# Branch "):
f3058dd05281 mq: record more data in patchheader class (no behavior changes)
Steve Borho <steve@borho.org>
parents: 13228
diff changeset
   157
                    branch = line[9:]
f3058dd05281 mq: record more data in patchheader class (no behavior changes)
Steve Borho <steve@borho.org>
parents: 13228
diff changeset
   158
                elif line.startswith("# Node ID "):
f3058dd05281 mq: record more data in patchheader class (no behavior changes)
Steve Borho <steve@borho.org>
parents: 13228
diff changeset
   159
                    nodeid = line[10:]
8653
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   160
                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
   161
                    message.append(line)
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   162
                    format = None
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   163
            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
   164
                message = []
8653
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   165
                format = "hgpatch"
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   166
            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
   167
                                           line.startswith("subject: "))):
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   168
                subject = line[9:]
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   169
                format = "tag"
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   170
            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
   171
                                           line.startswith("from: "))):
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   172
                user = line[6:]
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   173
                format = "tag"
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   174
            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
   175
                                           line.startswith("date: "))):
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   176
                date = line[6:]
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   177
                format = "tag"
8653
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   178
            elif format == "tag" and line == "":
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   179
                # 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
   180
                # 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
   181
                format = "tagdone"
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   182
            elif message or line:
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   183
                message.append(line)
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   184
            comments.append(line)
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   185
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   186
        eatdiff(message)
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   187
        eatdiff(comments)
13229
f3058dd05281 mq: record more data in patchheader class (no behavior changes)
Steve Borho <steve@borho.org>
parents: 13228
diff changeset
   188
        # Remember the exact starting line of the patch diffs before consuming
f3058dd05281 mq: record more data in patchheader class (no behavior changes)
Steve Borho <steve@borho.org>
parents: 13228
diff changeset
   189
        # empty lines, for external use by TortoiseHg and others
f3058dd05281 mq: record more data in patchheader class (no behavior changes)
Steve Borho <steve@borho.org>
parents: 13228
diff changeset
   190
        self.diffstartline = len(comments)
8653
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   191
        eatempty(message)
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   192
        eatempty(comments)
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   193
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   194
        # 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
   195
        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
   196
            message.insert(0, "")
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   197
            message.insert(0, subject)
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   198
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   199
        self.message = message
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   200
        self.comments = comments
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   201
        self.user = user
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   202
        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
   203
        self.parent = parent
13229
f3058dd05281 mq: record more data in patchheader class (no behavior changes)
Steve Borho <steve@borho.org>
parents: 13228
diff changeset
   204
        # nodeid and branch are for external use by TortoiseHg and others
f3058dd05281 mq: record more data in patchheader class (no behavior changes)
Steve Borho <steve@borho.org>
parents: 13228
diff changeset
   205
        self.nodeid = nodeid
f3058dd05281 mq: record more data in patchheader class (no behavior changes)
Steve Borho <steve@borho.org>
parents: 13228
diff changeset
   206
        self.branch = branch
8653
aa011d123f71 mq: initializing patchheader class directly from patch content
Cédric Duval <cedricduval@free.fr>
parents: 8632
diff changeset
   207
        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
   208
        self.plainmode = plainmode
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   209
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   210
    def setuser(self, user):
8654
f6cc3638f468 mq: rename setheader to updateheader and fix comment
Cédric Duval <cedricduval@free.fr>
parents: 8653
diff changeset
   211
        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
   212
            try:
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   213
                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
   214
                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
   215
            except ValueError:
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   216
                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
   217
                    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
   218
                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
   219
                    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
   220
                    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
   221
        self.user = user
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   222
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   223
    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
   224
        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
   225
            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
   226
                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
   227
                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
   228
            except ValueError:
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   229
                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
   230
                    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
   231
                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
   232
                    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
   233
                    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
   234
        self.date = date
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   235
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   236
    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
   237
        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
   238
            try:
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   239
                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
   240
                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
   241
            except ValueError:
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   242
                pass
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   243
        self.parent = parent
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   244
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   245
    def setmessage(self, message):
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   246
        if self.comments:
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   247
            self._delmsg()
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   248
        self.message = [message]
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   249
        self.comments += self.message
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   250
8654
f6cc3638f468 mq: rename setheader to updateheader and fix comment
Cédric Duval <cedricduval@free.fr>
parents: 8653
diff changeset
   251
    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
   252
        '''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
   253
        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
   254
        res = False
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   255
        for prefix in prefixes:
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   256
            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
   257
                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
   258
                    self.comments[i] = prefix + new
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   259
                    res = True
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   260
                    break
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   261
        return res
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   262
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
   263
    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
   264
        '''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
   265
        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
   266
            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
   267
                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
   268
                    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
   269
        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
   270
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   271
    def __str__(self):
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   272
        if not self.comments:
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   273
            return ''
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   274
        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
   275
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   276
    def _delmsg(self):
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   277
        '''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
   278
        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
   279
        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
   280
        if self.message:
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   281
            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
   282
            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
   283
                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
   284
                    del self.comments[i]
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   285
                    self.message = self.message[2:]
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   286
                    break
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   287
        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
   288
        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
   289
            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
   290
                ci += 1
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   291
            del self.comments[ci]
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   292
16102
50682c07a8d0 merge with stable
Matt Mackall <mpm@selenic.com>
parents: 16065 16101
diff changeset
   293
def newcommit(repo, phase, *args, **kwargs):
16057
db4b0532dbf2 mq: rename secretcommit to newcommit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 16048
diff changeset
   294
    """helper dedicated to ensure a commit respect mq.secret setting
db4b0532dbf2 mq: rename secretcommit to newcommit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 16048
diff changeset
   295
db4b0532dbf2 mq: rename secretcommit to newcommit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 16048
diff changeset
   296
    It should be used instead of repo.commit inside the mq source for operation
db4b0532dbf2 mq: rename secretcommit to newcommit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 16048
diff changeset
   297
    creating new changeset.
15926
f94513971767 mq: have mq create secret changeset only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15924
diff changeset
   298
    """
18010
38b51a60a195 clfilter: ensure that mq performs commits on unfiltered repos
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17954
diff changeset
   299
    repo = repo.unfiltered()
16100
24df9338aa01 mq: ensure all mq commits are made with secretcommit()
Patrick Mezard <patrick@mezard.eu>
parents: 16064
diff changeset
   300
    if phase is None:
24df9338aa01 mq: ensure all mq commits are made with secretcommit()
Patrick Mezard <patrick@mezard.eu>
parents: 16064
diff changeset
   301
        if repo.ui.configbool('mq', 'secret', False):
24df9338aa01 mq: ensure all mq commits are made with secretcommit()
Patrick Mezard <patrick@mezard.eu>
parents: 16064
diff changeset
   302
            phase = phases.secret
24df9338aa01 mq: ensure all mq commits are made with secretcommit()
Patrick Mezard <patrick@mezard.eu>
parents: 16064
diff changeset
   303
    if phase is not None:
24df9338aa01 mq: ensure all mq commits are made with secretcommit()
Patrick Mezard <patrick@mezard.eu>
parents: 16064
diff changeset
   304
        backup = repo.ui.backupconfig('phases', 'new-commit')
15926
f94513971767 mq: have mq create secret changeset only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15924
diff changeset
   305
    try:
16100
24df9338aa01 mq: ensure all mq commits are made with secretcommit()
Patrick Mezard <patrick@mezard.eu>
parents: 16064
diff changeset
   306
        if phase is not None:
24df9338aa01 mq: ensure all mq commits are made with secretcommit()
Patrick Mezard <patrick@mezard.eu>
parents: 16064
diff changeset
   307
            repo.ui.setconfig('phases', 'new-commit', phase)
15926
f94513971767 mq: have mq create secret changeset only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15924
diff changeset
   308
        return repo.commit(*args, **kwargs)
f94513971767 mq: have mq create secret changeset only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15924
diff changeset
   309
    finally:
16100
24df9338aa01 mq: ensure all mq commits are made with secretcommit()
Patrick Mezard <patrick@mezard.eu>
parents: 16064
diff changeset
   310
        if phase is not None:
24df9338aa01 mq: ensure all mq commits are made with secretcommit()
Patrick Mezard <patrick@mezard.eu>
parents: 16064
diff changeset
   311
            repo.ui.restoreconfig(backup)
15926
f94513971767 mq: have mq create secret changeset only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15924
diff changeset
   312
16654
490ed8972f1b mq: introduce qpush --check
Patrick Mezard <patrick@mezard.eu>
parents: 16653
diff changeset
   313
class AbortNoCleanup(error.Abort):
490ed8972f1b mq: introduce qpush --check
Patrick Mezard <patrick@mezard.eu>
parents: 16653
diff changeset
   314
    pass
490ed8972f1b mq: introduce qpush --check
Patrick Mezard <patrick@mezard.eu>
parents: 16653
diff changeset
   315
8778
c5f36402daad use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8761
diff changeset
   316
class queue(object):
19064
743daa601445 mq: do not inherit settings form base repo in mqrepo (Fixes issue2358)
Simon Heimberg <simohe@besonet.ch>
parents: 18958
diff changeset
   317
    def __init__(self, ui, baseui, path, patchdir=None):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   318
        self.basepath = path
11229
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
   319
        try:
11270
457813cb3024 mq: fix naming issues for qqueue directories
Henrik Stuart <hg@hstuart.dk>
parents: 11234
diff changeset
   320
            fh = open(os.path.join(path, 'patches.queue'))
457813cb3024 mq: fix naming issues for qqueue directories
Henrik Stuart <hg@hstuart.dk>
parents: 11234
diff changeset
   321
            cur = fh.read().rstrip()
13400
14f3795a5ed7 explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13373
diff changeset
   322
            fh.close()
11270
457813cb3024 mq: fix naming issues for qqueue directories
Henrik Stuart <hg@hstuart.dk>
parents: 11234
diff changeset
   323
            if not cur:
457813cb3024 mq: fix naming issues for qqueue directories
Henrik Stuart <hg@hstuart.dk>
parents: 11234
diff changeset
   324
                curpath = os.path.join(path, 'patches')
457813cb3024 mq: fix naming issues for qqueue directories
Henrik Stuart <hg@hstuart.dk>
parents: 11234
diff changeset
   325
            else:
457813cb3024 mq: fix naming issues for qqueue directories
Henrik Stuart <hg@hstuart.dk>
parents: 11234
diff changeset
   326
                curpath = os.path.join(path, 'patches-' + cur)
11229
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
   327
        except IOError:
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
   328
            curpath = os.path.join(path, 'patches')
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
   329
        self.path = patchdir or curpath
13970
d13913355390 move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13878
diff changeset
   330
        self.opener = scmutil.opener(self.path)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   331
        self.ui = ui
19064
743daa601445 mq: do not inherit settings form base repo in mqrepo (Fixes issue2358)
Simon Heimberg <simohe@besonet.ch>
parents: 18958
diff changeset
   332
        self.baseui = baseui
15879
710e6bf15538 mq: consistently use boolean values for dirty flags
Mads Kiilerich <mads@kiilerich.com>
parents: 15878
diff changeset
   333
        self.applieddirty = False
710e6bf15538 mq: consistently use boolean values for dirty flags
Mads Kiilerich <mads@kiilerich.com>
parents: 15878
diff changeset
   334
        self.seriesdirty = False
11462
1b82a26635d7 mq: qimport cleanup on fail (issue2214)
Vishakh H <vsh426@gmail.com>
parents: 11439
diff changeset
   335
        self.added = []
14587
5d3bb4460256 mq: rename series_path to seriespath
Adrian Buehlmann <adrian@cadifra.com>
parents: 14586
diff changeset
   336
        self.seriespath = "series"
14588
bd3d75a03f80 mq: rename status_path to statuspath
Adrian Buehlmann <adrian@cadifra.com>
parents: 14587
diff changeset
   337
        self.statuspath = "status"
14589
7d59ee9e711b mq: rename guards_path to guardspath
Adrian Buehlmann <adrian@cadifra.com>
parents: 14588
diff changeset
   338
        self.guardspath = "guards"
14590
dbb80f03d4ae mq: rename active_guards to activeguards
Adrian Buehlmann <adrian@cadifra.com>
parents: 14589
diff changeset
   339
        self.activeguards = None
14591
b49099712d30 mq: rename guards_dirty to guardsdirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14590
diff changeset
   340
        self.guardsdirty = False
10190
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   341
        # 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
   342
        try:
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   343
            gitmode = ui.configbool('mq', 'git', None)
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   344
            if gitmode is None:
16687
e34106fa0dc3 cleanup: "raise SomeException()" -> "raise SomeException"
Brodie Rao <brodie@sf.io>
parents: 16683
diff changeset
   345
                raise error.ConfigError
10190
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   346
            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
   347
        except error.ConfigError:
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   348
            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
   349
        self.plainmode = ui.configbool('mq', 'plain', False)
19856
28b1b7b9b4a9 shelve: allow shelving of a change with an mq patch applied
David Soria Parra <dsp@experimentalworks.net>
parents: 19826
diff changeset
   350
        self.checkapplied = True
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   351
8524
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   352
    @util.propertycache
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   353
    def applied(self):
15258
fe9677449331 mq: eliminate explicit checks for file existence
Idan Kamara <idankk86@gmail.com>
parents: 15257
diff changeset
   354
        def parselines(lines):
fe9677449331 mq: eliminate explicit checks for file existence
Idan Kamara <idankk86@gmail.com>
parents: 15257
diff changeset
   355
            for l in lines:
fe9677449331 mq: eliminate explicit checks for file existence
Idan Kamara <idankk86@gmail.com>
parents: 15257
diff changeset
   356
                entry = l.split(':', 1)
fe9677449331 mq: eliminate explicit checks for file existence
Idan Kamara <idankk86@gmail.com>
parents: 15257
diff changeset
   357
                if len(entry) > 1:
fe9677449331 mq: eliminate explicit checks for file existence
Idan Kamara <idankk86@gmail.com>
parents: 15257
diff changeset
   358
                    n, name = entry
fe9677449331 mq: eliminate explicit checks for file existence
Idan Kamara <idankk86@gmail.com>
parents: 15257
diff changeset
   359
                    yield statusentry(bin(n), name)
fe9677449331 mq: eliminate explicit checks for file existence
Idan Kamara <idankk86@gmail.com>
parents: 15257
diff changeset
   360
                elif l.strip():
fe9677449331 mq: eliminate explicit checks for file existence
Idan Kamara <idankk86@gmail.com>
parents: 15257
diff changeset
   361
                    self.ui.warn(_('malformated mq status line: %s\n') % entry)
fe9677449331 mq: eliminate explicit checks for file existence
Idan Kamara <idankk86@gmail.com>
parents: 15257
diff changeset
   362
                # else we ignore empty lines
fe9677449331 mq: eliminate explicit checks for file existence
Idan Kamara <idankk86@gmail.com>
parents: 15257
diff changeset
   363
        try:
14588
bd3d75a03f80 mq: rename status_path to statuspath
Adrian Buehlmann <adrian@cadifra.com>
parents: 14587
diff changeset
   364
            lines = self.opener.read(self.statuspath).splitlines()
13507
375ba42f3cda mq: gracefully handle malformated status file
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 13409
diff changeset
   365
            return list(parselines(lines))
15258
fe9677449331 mq: eliminate explicit checks for file existence
Idan Kamara <idankk86@gmail.com>
parents: 15257
diff changeset
   366
        except IOError, e:
fe9677449331 mq: eliminate explicit checks for file existence
Idan Kamara <idankk86@gmail.com>
parents: 15257
diff changeset
   367
            if e.errno == errno.ENOENT:
fe9677449331 mq: eliminate explicit checks for file existence
Idan Kamara <idankk86@gmail.com>
parents: 15257
diff changeset
   368
                return []
fe9677449331 mq: eliminate explicit checks for file existence
Idan Kamara <idankk86@gmail.com>
parents: 15257
diff changeset
   369
            raise
8524
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   370
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   371
    @util.propertycache
14572
8ff2957c1d82 mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14564
diff changeset
   372
    def fullseries(self):
15258
fe9677449331 mq: eliminate explicit checks for file existence
Idan Kamara <idankk86@gmail.com>
parents: 15257
diff changeset
   373
        try:
15878
914b013d3263 mq: minor cleanup
Mads Kiilerich <mads@kiilerich.com>
parents: 15801
diff changeset
   374
            return self.opener.read(self.seriespath).splitlines()
15258
fe9677449331 mq: eliminate explicit checks for file existence
Idan Kamara <idankk86@gmail.com>
parents: 15257
diff changeset
   375
        except IOError, e:
fe9677449331 mq: eliminate explicit checks for file existence
Idan Kamara <idankk86@gmail.com>
parents: 15257
diff changeset
   376
            if e.errno == errno.ENOENT:
fe9677449331 mq: eliminate explicit checks for file existence
Idan Kamara <idankk86@gmail.com>
parents: 15257
diff changeset
   377
                return []
fe9677449331 mq: eliminate explicit checks for file existence
Idan Kamara <idankk86@gmail.com>
parents: 15257
diff changeset
   378
            raise
8524
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   379
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   380
    @util.propertycache
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   381
    def series(self):
14575
845c864200d0 mq: rename parse_series to parseseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14574
diff changeset
   382
        self.parseseries()
8524
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   383
        return self.series
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   384
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
   385
    @util.propertycache
14573
d590ff1f22b2 mq: rename series_guards to seriesguards
Adrian Buehlmann <adrian@cadifra.com>
parents: 14572
diff changeset
   386
    def seriesguards(self):
14575
845c864200d0 mq: rename parse_series to parseseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14574
diff changeset
   387
        self.parseseries()
14573
d590ff1f22b2 mq: rename series_guards to seriesguards
Adrian Buehlmann <adrian@cadifra.com>
parents: 14572
diff changeset
   388
        return self.seriesguards
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   389
8525
b169ba60eebe mq: new method invalidate
Simon Heimberg <simohe@besonet.ch>
parents: 8524
diff changeset
   390
    def invalidate(self):
14573
d590ff1f22b2 mq: rename series_guards to seriesguards
Adrian Buehlmann <adrian@cadifra.com>
parents: 14572
diff changeset
   391
        for a in 'applied fullseries series seriesguards'.split():
8525
b169ba60eebe mq: new method invalidate
Simon Heimberg <simohe@besonet.ch>
parents: 8524
diff changeset
   392
            if a in self.__dict__:
b169ba60eebe mq: new method invalidate
Simon Heimberg <simohe@besonet.ch>
parents: 8524
diff changeset
   393
                delattr(self, a)
15879
710e6bf15538 mq: consistently use boolean values for dirty flags
Mads Kiilerich <mads@kiilerich.com>
parents: 15878
diff changeset
   394
        self.applieddirty = False
710e6bf15538 mq: consistently use boolean values for dirty flags
Mads Kiilerich <mads@kiilerich.com>
parents: 15878
diff changeset
   395
        self.seriesdirty = False
14591
b49099712d30 mq: rename guards_dirty to guardsdirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14590
diff changeset
   396
        self.guardsdirty = False
14590
dbb80f03d4ae mq: rename active_guards to activeguards
Adrian Buehlmann <adrian@cadifra.com>
parents: 14589
diff changeset
   397
        self.activeguards = None
8525
b169ba60eebe mq: new method invalidate
Simon Heimberg <simohe@besonet.ch>
parents: 8524
diff changeset
   398
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
   399
    def diffopts(self, opts={}, patchfn=None):
14241
45f7aa35f2fd mq: don't hide the patch module
Idan Kamara <idankk86@gmail.com>
parents: 14239
diff changeset
   400
        diffopts = patchmod.diffopts(self.ui, opts)
10190
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   401
        if self.gitmode == 'auto':
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   402
            diffopts.upgrade = True
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   403
        elif self.gitmode == 'keep':
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   404
            pass
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   405
        elif self.gitmode in ('yes', 'no'):
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   406
            diffopts.git = self.gitmode == 'yes'
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   407
        else:
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   408
            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
   409
                               ' got %s') % self.gitmode)
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
   410
        if patchfn:
10185
7637fe4f525d mq: preserve --git flag when merging patches
Patrick Mezard <pmezard@gmail.com>
parents: 10184
diff changeset
   411
            diffopts = self.patchopts(diffopts, patchfn)
7637fe4f525d mq: preserve --git flag when merging patches
Patrick Mezard <pmezard@gmail.com>
parents: 10184
diff changeset
   412
        return diffopts
7637fe4f525d mq: preserve --git flag when merging patches
Patrick Mezard <pmezard@gmail.com>
parents: 10184
diff changeset
   413
10186
296a0b14a686 mq: preserve --git flag when folding patches
Patrick Mezard <pmezard@gmail.com>
parents: 10185
diff changeset
   414
    def patchopts(self, diffopts, *patches):
10185
7637fe4f525d mq: preserve --git flag when merging patches
Patrick Mezard <pmezard@gmail.com>
parents: 10184
diff changeset
   415
        """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
   416
        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
   417
        """
7637fe4f525d mq: preserve --git flag when merging patches
Patrick Mezard <pmezard@gmail.com>
parents: 10184
diff changeset
   418
        diffopts = diffopts.copy()
10190
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   419
        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
   420
            for patchfn in patches:
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   421
                patchf = self.opener(patchfn, 'r')
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   422
                # 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
   423
                for line in patchf:
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   424
                    if line.startswith('diff --git'):
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   425
                        diffopts.git = True
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   426
                        break
9c2c94934f0d mq: upgrade to git patch when necessary (issue767)
Patrick Mezard <pmezard@gmail.com>
parents: 10188
diff changeset
   427
                patchf.close()
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
   428
        return diffopts
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
   429
2819
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
   430
    def join(self, *p):
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
   431
        return os.path.join(self.path, *p)
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
   432
14574
12fba7bcb4f1 mq: rename find_series to findseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14573
diff changeset
   433
    def findseries(self, patch):
10685
10248fc845db mq: find_series() simplify and don't use regexps
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10684
diff changeset
   434
        def matchpatch(l):
10248fc845db mq: find_series() simplify and don't use regexps
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10684
diff changeset
   435
            l = l.split('#', 1)[0]
10248fc845db mq: find_series() simplify and don't use regexps
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10684
diff changeset
   436
            return l.strip() == patch
14572
8ff2957c1d82 mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14564
diff changeset
   437
        for index, l in enumerate(self.fullseries):
10685
10248fc845db mq: find_series() simplify and don't use regexps
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10684
diff changeset
   438
            if matchpatch(l):
10248fc845db mq: find_series() simplify and don't use regexps
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10684
diff changeset
   439
                return index
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   440
        return None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   441
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   442
    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
   443
14575
845c864200d0 mq: rename parse_series to parseseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14574
diff changeset
   444
    def parseseries(self):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   445
        self.series = []
14573
d590ff1f22b2 mq: rename series_guards to seriesguards
Adrian Buehlmann <adrian@cadifra.com>
parents: 14572
diff changeset
   446
        self.seriesguards = []
14572
8ff2957c1d82 mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14564
diff changeset
   447
        for l in self.fullseries:
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   448
            h = l.find('#')
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   449
            if h == -1:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   450
                patch = l
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   451
                comment = ''
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   452
            elif h == 0:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   453
                continue
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   454
            else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   455
                patch = l[:h]
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   456
                comment = l[h:]
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   457
            patch = patch.strip()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   458
            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
   459
                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
   460
                    raise util.Abort(_('%s appears more than once in %s') %
14587
5d3bb4460256 mq: rename series_path to seriespath
Adrian Buehlmann <adrian@cadifra.com>
parents: 14586
diff changeset
   461
                                     (patch, self.join(self.seriespath)))
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   462
                self.series.append(patch)
14573
d590ff1f22b2 mq: rename series_guards to seriesguards
Adrian Buehlmann <adrian@cadifra.com>
parents: 14572
diff changeset
   463
                self.seriesguards.append(self.guard_re.findall(comment))
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   464
14576
668ea374f46e mq: rename check_guard to checkguard
Adrian Buehlmann <adrian@cadifra.com>
parents: 14575
diff changeset
   465
    def checkguard(self, guard):
6607
75b506f0e571 mq: make qselect fail properly on an empty guard
Patrick Mezard <pmezard@gmail.com>
parents: 6606
diff changeset
   466
        if not guard:
75b506f0e571 mq: make qselect fail properly on an empty guard
Patrick Mezard <pmezard@gmail.com>
parents: 6606
diff changeset
   467
            return _('guard cannot be an empty string')
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   468
        bad_chars = '# \t\r\n\f'
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   469
        first = guard[0]
8288
9de088320e9a mq: simpler check of first character of guard name
Simon Heimberg <simohe@besonet.ch>
parents: 8225
diff changeset
   470
        if first in '-+':
9de088320e9a mq: simpler check of first character of guard name
Simon Heimberg <simohe@besonet.ch>
parents: 8225
diff changeset
   471
            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
   472
                      (guard, first))
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   473
        for c in bad_chars:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   474
            if c in guard:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   475
                return _('invalid character in guard %r: %r') % (guard, c)
3223
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3186
diff changeset
   476
14578
28a2646f3b81 mq: rename set_active to setactive
Adrian Buehlmann <adrian@cadifra.com>
parents: 14577
diff changeset
   477
    def setactive(self, guards):
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   478
        for guard in guards:
14576
668ea374f46e mq: rename check_guard to checkguard
Adrian Buehlmann <adrian@cadifra.com>
parents: 14575
diff changeset
   479
            bad = self.checkguard(guard)
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   480
            if bad:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   481
                raise util.Abort(bad)
8209
a1a5a57efe90 replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents: 8188
diff changeset
   482
        guards = sorted(set(guards))
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9440
diff changeset
   483
        self.ui.debug('active guards: %s\n' % ' '.join(guards))
14590
dbb80f03d4ae mq: rename active_guards to activeguards
Adrian Buehlmann <adrian@cadifra.com>
parents: 14589
diff changeset
   484
        self.activeguards = guards
14591
b49099712d30 mq: rename guards_dirty to guardsdirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14590
diff changeset
   485
        self.guardsdirty = True
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   486
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   487
    def active(self):
14590
dbb80f03d4ae mq: rename active_guards to activeguards
Adrian Buehlmann <adrian@cadifra.com>
parents: 14589
diff changeset
   488
        if self.activeguards is None:
dbb80f03d4ae mq: rename active_guards to activeguards
Adrian Buehlmann <adrian@cadifra.com>
parents: 14589
diff changeset
   489
            self.activeguards = []
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   490
            try:
14589
7d59ee9e711b mq: rename guards_path to guardspath
Adrian Buehlmann <adrian@cadifra.com>
parents: 14588
diff changeset
   491
                guards = self.opener.read(self.guardspath).split()
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   492
            except IOError, err:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
   493
                if err.errno != errno.ENOENT:
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
   494
                    raise
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   495
                guards = []
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   496
            for i, guard in enumerate(guards):
14576
668ea374f46e mq: rename check_guard to checkguard
Adrian Buehlmann <adrian@cadifra.com>
parents: 14575
diff changeset
   497
                bad = self.checkguard(guard)
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   498
                if bad:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   499
                    self.ui.warn('%s:%d: %s\n' %
14589
7d59ee9e711b mq: rename guards_path to guardspath
Adrian Buehlmann <adrian@cadifra.com>
parents: 14588
diff changeset
   500
                                 (self.join(self.guardspath), i + 1, bad))
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   501
                else:
14590
dbb80f03d4ae mq: rename active_guards to activeguards
Adrian Buehlmann <adrian@cadifra.com>
parents: 14589
diff changeset
   502
                    self.activeguards.append(guard)
dbb80f03d4ae mq: rename active_guards to activeguards
Adrian Buehlmann <adrian@cadifra.com>
parents: 14589
diff changeset
   503
        return self.activeguards
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   504
14577
76357276662e mq: rename set_guards to setguards
Adrian Buehlmann <adrian@cadifra.com>
parents: 14576
diff changeset
   505
    def setguards(self, idx, guards):
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   506
        for g in guards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   507
            if len(g) < 2:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   508
                raise util.Abort(_('guard %r too short') % g)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   509
            if g[0] not in '-+':
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   510
                raise util.Abort(_('guard %r starts with invalid char') % g)
14576
668ea374f46e mq: rename check_guard to checkguard
Adrian Buehlmann <adrian@cadifra.com>
parents: 14575
diff changeset
   511
            bad = self.checkguard(g[1:])
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   512
            if bad:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   513
                raise util.Abort(bad)
14572
8ff2957c1d82 mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14564
diff changeset
   514
        drop = self.guard_re.sub('', self.fullseries[idx])
8ff2957c1d82 mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14564
diff changeset
   515
        self.fullseries[idx] = drop + ''.join([' #' + g for g in guards])
14575
845c864200d0 mq: rename parse_series to parseseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14574
diff changeset
   516
        self.parseseries()
14593
599a72895c0d mq: rename series_dirty to seriesdirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14592
diff changeset
   517
        self.seriesdirty = True
3223
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3186
diff changeset
   518
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   519
    def pushable(self, idx):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   520
        if isinstance(idx, str):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   521
            idx = self.series.index(idx)
14573
d590ff1f22b2 mq: rename series_guards to seriesguards
Adrian Buehlmann <adrian@cadifra.com>
parents: 14572
diff changeset
   522
        patchguards = self.seriesguards[idx]
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   523
        if not patchguards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   524
            return True, None
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   525
        guards = self.active()
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   526
        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
   527
        if exactneg:
14464
00256f689f9c mq: print "'foo' 'bar'", not "['foo', 'bar']" when showing guards
Martin Geisler <mg@aragost.com>
parents: 14448
diff changeset
   528
            return False, repr(exactneg[0])
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   529
        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
   530
        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
   531
        if pos:
2850
851b07ec450c mq: apply patch is any posative guard matches
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2848
diff changeset
   532
            if exactpos:
14464
00256f689f9c mq: print "'foo' 'bar'", not "['foo', 'bar']" when showing guards
Martin Geisler <mg@aragost.com>
parents: 14448
diff changeset
   533
                return True, repr(exactpos[0])
00256f689f9c mq: print "'foo' 'bar'", not "['foo', 'bar']" when showing guards
Martin Geisler <mg@aragost.com>
parents: 14448
diff changeset
   534
            return False, ' '.join(map(repr, pos))
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   535
        return True, ''
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   536
14579
f7b25764d974 mq: rename explain_pushable to explainpushable
Adrian Buehlmann <adrian@cadifra.com>
parents: 14578
diff changeset
   537
    def explainpushable(self, idx, all_patches=False):
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   538
        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
   539
        if all_patches or self.ui.verbose:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   540
            if isinstance(idx, str):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   541
                idx = self.series.index(idx)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   542
            pushable, why = self.pushable(idx)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   543
            if all_patches and pushable:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   544
                if why is None:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   545
                    write(_('allowing %s - no guards in effect\n') %
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   546
                          self.series[idx])
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   547
                else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   548
                    if not why:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   549
                        write(_('allowing %s - no matching negative guards\n') %
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   550
                              self.series[idx])
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   551
                    else:
14464
00256f689f9c mq: print "'foo' 'bar'", not "['foo', 'bar']" when showing guards
Martin Geisler <mg@aragost.com>
parents: 14448
diff changeset
   552
                        write(_('allowing %s - guarded by %s\n') %
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   553
                              (self.series[idx], why))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   554
            if not pushable:
2829
05316bb57d01 mq: make guards more strict, add tests
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2828
diff changeset
   555
                if why:
14464
00256f689f9c mq: print "'foo' 'bar'", not "['foo', 'bar']" when showing guards
Martin Geisler <mg@aragost.com>
parents: 14448
diff changeset
   556
                    write(_('skipping %s - guarded by %s\n') %
3870
22d18051f9e5 mq: fix explain_pushable for negative guards
Brendan Cully <brendan@kublai.com>
parents: 3857
diff changeset
   557
                          (self.series[idx], why))
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   558
                else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   559
                    write(_('skipping %s - no matching guards\n') %
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   560
                          self.series[idx])
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   561
14580
92101ea35015 mq: rename save_dirty to savedirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14579
diff changeset
   562
    def savedirty(self):
14594
3752b5e1f4c4 mq: rename write_list to writelist
Adrian Buehlmann <adrian@cadifra.com>
parents: 14593
diff changeset
   563
        def writelist(items, path):
2772
4720e79486d3 mq: simplify save_dirty
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2771
diff changeset
   564
            fp = self.opener(path, 'w')
4720e79486d3 mq: simplify save_dirty
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2771
diff changeset
   565
            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
   566
                fp.write("%s\n" % i)
2772
4720e79486d3 mq: simplify save_dirty
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2771
diff changeset
   567
            fp.close()
14592
fc94add69d9f mq: rename applied_dirty to applieddirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14591
diff changeset
   568
        if self.applieddirty:
14594
3752b5e1f4c4 mq: rename write_list to writelist
Adrian Buehlmann <adrian@cadifra.com>
parents: 14593
diff changeset
   569
            writelist(map(str, self.applied), self.statuspath)
15883
91d99f02b26f mq: only save dirty files once when savedirty is called multiple times
Mads Kiilerich <mads@kiilerich.com>
parents: 15882
diff changeset
   570
            self.applieddirty = False
14593
599a72895c0d mq: rename series_dirty to seriesdirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14592
diff changeset
   571
        if self.seriesdirty:
14594
3752b5e1f4c4 mq: rename write_list to writelist
Adrian Buehlmann <adrian@cadifra.com>
parents: 14593
diff changeset
   572
            writelist(self.fullseries, self.seriespath)
15883
91d99f02b26f mq: only save dirty files once when savedirty is called multiple times
Mads Kiilerich <mads@kiilerich.com>
parents: 15882
diff changeset
   573
            self.seriesdirty = False
14591
b49099712d30 mq: rename guards_dirty to guardsdirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14590
diff changeset
   574
        if self.guardsdirty:
14594
3752b5e1f4c4 mq: rename write_list to writelist
Adrian Buehlmann <adrian@cadifra.com>
parents: 14593
diff changeset
   575
            writelist(self.activeguards, self.guardspath)
15883
91d99f02b26f mq: only save dirty files once when savedirty is called multiple times
Mads Kiilerich <mads@kiilerich.com>
parents: 15882
diff changeset
   576
            self.guardsdirty = False
11546
134eb1c97e94 mq: qrepo.add(mq.added) inside save_dirty inside of doing it manually
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11530
diff changeset
   577
        if self.added:
134eb1c97e94 mq: qrepo.add(mq.added) inside save_dirty inside of doing it manually
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11530
diff changeset
   578
            qrepo = self.qrepo()
134eb1c97e94 mq: qrepo.add(mq.added) inside save_dirty inside of doing it manually
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11530
diff changeset
   579
            if qrepo:
12658
97d7ee445e98 mq: silence spurious output.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12655
diff changeset
   580
                qrepo[None].add(f for f in self.added if f not in qrepo[None])
11546
134eb1c97e94 mq: qrepo.add(mq.added) inside save_dirty inside of doing it manually
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11530
diff changeset
   581
            self.added = []
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   582
4207
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4206
diff changeset
   583
    def removeundo(self, repo):
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4206
diff changeset
   584
        undo = repo.sjoin('undo')
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4206
diff changeset
   585
        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
   586
            return
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4206
diff changeset
   587
        try:
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4206
diff changeset
   588
            os.unlink(undo)
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4206
diff changeset
   589
        except OSError, inst:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
   590
            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
   591
16634
435375cc0ca0 mq: backup local changes in qpush --force
Patrick Mezard <patrick@mezard.eu>
parents: 16633
diff changeset
   592
    def backup(self, repo, files, copy=False):
16633
b2ca2f40c9c1 mq: backup local changes in qpop --force (issue3433)
Patrick Mezard <patrick@mezard.eu>
parents: 16551
diff changeset
   593
        # backup local changes in --force case
b2ca2f40c9c1 mq: backup local changes in qpop --force (issue3433)
Patrick Mezard <patrick@mezard.eu>
parents: 16551
diff changeset
   594
        for f in sorted(files):
b2ca2f40c9c1 mq: backup local changes in qpop --force (issue3433)
Patrick Mezard <patrick@mezard.eu>
parents: 16551
diff changeset
   595
            absf = repo.wjoin(f)
b2ca2f40c9c1 mq: backup local changes in qpop --force (issue3433)
Patrick Mezard <patrick@mezard.eu>
parents: 16551
diff changeset
   596
            if os.path.lexists(absf):
b2ca2f40c9c1 mq: backup local changes in qpop --force (issue3433)
Patrick Mezard <patrick@mezard.eu>
parents: 16551
diff changeset
   597
                self.ui.note(_('saving current version of %s as %s\n') %
b2ca2f40c9c1 mq: backup local changes in qpop --force (issue3433)
Patrick Mezard <patrick@mezard.eu>
parents: 16551
diff changeset
   598
                             (f, f + '.orig'))
16634
435375cc0ca0 mq: backup local changes in qpush --force
Patrick Mezard <patrick@mezard.eu>
parents: 16633
diff changeset
   599
                if copy:
435375cc0ca0 mq: backup local changes in qpush --force
Patrick Mezard <patrick@mezard.eu>
parents: 16633
diff changeset
   600
                    util.copyfile(absf, absf + '.orig')
435375cc0ca0 mq: backup local changes in qpush --force
Patrick Mezard <patrick@mezard.eu>
parents: 16633
diff changeset
   601
                else:
435375cc0ca0 mq: backup local changes in qpush --force
Patrick Mezard <patrick@mezard.eu>
parents: 16633
diff changeset
   602
                    util.rename(absf, absf + '.orig')
16633
b2ca2f40c9c1 mq: backup local changes in qpop --force (issue3433)
Patrick Mezard <patrick@mezard.eu>
parents: 16551
diff changeset
   603
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
   604
    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
   605
                  fp=None, changes=None, opts={}):
9640
9e76232fbfbe diff: add --stat for diffstat output
Brodie Rao <me+hg@dackz.net>
parents: 9599
diff changeset
   606
        stat = opts.get('stat')
14671
35c2cc322ba8 scmutil: switch match users to supplying contexts
Matt Mackall <mpm@selenic.com>
parents: 14636
diff changeset
   607
        m = scmutil.match(repo[node1], files, opts)
11050
5d35f7d93514 commands: refactor diff --stat and qdiff --stat
Yuya Nishihara <yuya@tcha.org>
parents: 11049
diff changeset
   608
        cmdutil.diffordiffstat(self.ui, repo, diffopts, node1, node2,  m,
5d35f7d93514 commands: refactor diff --stat and qdiff --stat
Yuya Nishihara <yuya@tcha.org>
parents: 11049
diff changeset
   609
                               changes, stat, fp)
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2873
diff changeset
   610
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
   611
    def mergeone(self, repo, mergeq, head, patch, rev, diffopts):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   612
        # first try just applying the patch
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
   613
        (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
   614
                              strict=True, merge=rev)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   615
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   616
        if err == 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   617
            return (err, n)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   618
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   619
        if n is None:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
   620
            raise util.Abort(_("apply failed for patch %s") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   621
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
   622
        self.ui.warn(_("patch didn't work out, merging %s\n") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   623
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   624
        # 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
   625
        hg.clean(repo, head)
19819
f0fc4d5797e1 mq: extract `mq.queue.strip`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19818
diff changeset
   626
        strip(self.ui, repo, [n], update=False, backup='strip')
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   627
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6668
diff changeset
   628
        ctx = repo[rev]
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
   629
        ret = hg.merge(repo, rev)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   630
        if ret:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
   631
            raise util.Abort(_("update returned %d") % ret)
16102
50682c07a8d0 merge with stable
Matt Mackall <mpm@selenic.com>
parents: 16065 16101
diff changeset
   632
        n = newcommit(repo, None, 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
   633
        if n is None:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
   634
            raise util.Abort(_("repo commit failed"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   635
        try:
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   636
            ph = patchheader(mergeq.join(patch), self.plainmode)
16689
f366d4c2ff34 cleanup: replace naked excepts with except Exception: ...
Brodie Rao <brodie@sf.io>
parents: 16688
diff changeset
   637
        except Exception:
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
   638
            raise util.Abort(_("unable to read %s") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   639
10185
7637fe4f525d mq: preserve --git flag when merging patches
Patrick Mezard <pmezard@gmail.com>
parents: 10184
diff changeset
   640
        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
   641
        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
   642
        comments = str(ph)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   643
        if comments:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   644
            patchf.write(comments)
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
   645
        self.printdiff(repo, diffopts, head, n, fp=patchf)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   646
        patchf.close()
4207
b7e66db28571 Remove undo log after mq operations that rollback would break
Brendan Cully <brendan@kublai.com>
parents: 4206
diff changeset
   647
        self.removeundo(repo)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   648
        return (0, n)
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   649
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   650
    def qparents(self, repo, rev=None):
19816
d5ec50e8604b mq: document repo.mq.qparents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19815
diff changeset
   651
        """return the mq handled parent or p1
d5ec50e8604b mq: document repo.mq.qparents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19815
diff changeset
   652
d5ec50e8604b mq: document repo.mq.qparents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19815
diff changeset
   653
        In some case where mq get himself in being the parent of a merge the
19951
d51c4d85ec23 spelling: random spell checker fixes
Mads Kiilerich <madski@unity3d.com>
parents: 19916
diff changeset
   654
        appropriate parent may be p2.
19816
d5ec50e8604b mq: document repo.mq.qparents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19815
diff changeset
   655
        (eg: an in progress merge started with mq disabled)
d5ec50e8604b mq: document repo.mq.qparents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19815
diff changeset
   656
d5ec50e8604b mq: document repo.mq.qparents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19815
diff changeset
   657
        If no parent are managed by mq, p1 is returned.
d5ec50e8604b mq: document repo.mq.qparents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19815
diff changeset
   658
        """
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   659
        if rev is None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   660
            (p1, p2) = repo.dirstate.parents()
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   661
            if p2 == nullid:
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   662
                return p1
10686
0c68c2c36ed8 mq: don't use len(list) unless necessary
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10685
diff changeset
   663
            if not self.applied:
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   664
                return None
10678
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10663
diff changeset
   665
            return self.applied[-1].node
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10663
diff changeset
   666
        p1, p2 = repo.changelog.parents(rev)
10680
45eb9b5dacf6 mq: simplify qparents calculation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10679
diff changeset
   667
        if p2 != nullid and p2 in [x.node for x in self.applied]:
45eb9b5dacf6 mq: simplify qparents calculation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10679
diff changeset
   668
            return p2
10678
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10663
diff changeset
   669
        return p1
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   670
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
   671
    def mergepatch(self, repo, mergeq, series, diffopts):
10686
0c68c2c36ed8 mq: don't use len(list) unless necessary
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10685
diff changeset
   672
        if not self.applied:
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   673
            # each of the patches merged in will have two parents.  This
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   674
            # can confuse the qrefresh, qdiff, and strip code because it
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   675
            # needs to know which parent is actually in the patch queue.
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   676
            # so, we insert a merge marker with only one parent.  This way
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   677
            # the first patch in the queue is never a merge patch
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   678
            #
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   679
            pname = ".hg.patches.merge.marker"
16102
50682c07a8d0 merge with stable
Matt Mackall <mpm@selenic.com>
parents: 16065 16101
diff changeset
   680
            n = newcommit(repo, None, '[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
   681
            self.removeundo(repo)
10678
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10663
diff changeset
   682
            self.applied.append(statusentry(n, pname))
15879
710e6bf15538 mq: consistently use boolean values for dirty flags
Mads Kiilerich <mads@kiilerich.com>
parents: 15878
diff changeset
   683
            self.applieddirty = True
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   684
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   685
        head = self.qparents(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   686
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   687
        for patch in series:
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
   688
            patch = mergeq.lookup(patch, strict=True)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   689
            if not patch:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
   690
                self.ui.warn(_("patch %s does not exist\n") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   691
                return (1, None)
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   692
            pushable, reason = self.pushable(patch)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   693
            if not pushable:
14579
f7b25764d974 mq: rename explain_pushable to explainpushable
Adrian Buehlmann <adrian@cadifra.com>
parents: 14578
diff changeset
   694
                self.explainpushable(patch, all_patches=True)
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   695
                continue
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   696
            info = mergeq.isapplied(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   697
            if not info:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
   698
                self.ui.warn(_("patch %s is not applied\n") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   699
                return (1, None)
10678
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10663
diff changeset
   700
            rev = info[1]
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
   701
            err, head = self.mergeone(repo, mergeq, head, patch, rev, diffopts)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   702
            if head:
10678
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10663
diff changeset
   703
                self.applied.append(statusentry(head, patch))
15879
710e6bf15538 mq: consistently use boolean values for dirty flags
Mads Kiilerich <mads@kiilerich.com>
parents: 15878
diff changeset
   704
                self.applieddirty = True
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   705
            if err:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   706
                return (err, head)
14580
92101ea35015 mq: rename save_dirty to savedirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14579
diff changeset
   707
        self.savedirty()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   708
        return (0, head)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   709
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   710
    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
   711
        '''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
   712
        patchfile: name of patch file'''
14564
65f4512e40e4 patch: turn patch() touched files dict into a set
Patrick Mezard <pmezard@gmail.com>
parents: 14553
diff changeset
   713
        files = set()
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
   714
        try:
14260
00a881581400 patch: make patch()/internalpatch() always update the dirstate
Patrick Mezard <pmezard@gmail.com>
parents: 14259
diff changeset
   715
            fuzz = patchmod.patch(self.ui, repo, patchfile, strip=1,
14382
2d16f15da7bd patch: remove patch.patch() cwd argument
Patrick Mezard <pmezard@gmail.com>
parents: 14351
diff changeset
   716
                                  files=files, eolmode=None)
14260
00a881581400 patch: make patch()/internalpatch() always update the dirstate
Patrick Mezard <pmezard@gmail.com>
parents: 14259
diff changeset
   717
            return (True, list(files), fuzz)
2919
b70740aefa4d Unify mq and hg patch invocation.
Brendan Cully <brendan@kublai.com>
parents: 2905
diff changeset
   718
        except Exception, inst:
b70740aefa4d Unify mq and hg patch invocation.
Brendan Cully <brendan@kublai.com>
parents: 2905
diff changeset
   719
            self.ui.note(str(inst) + '\n')
b70740aefa4d Unify mq and hg patch invocation.
Brendan Cully <brendan@kublai.com>
parents: 2905
diff changeset
   720
            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
   721
                self.ui.warn(_("patch failed, unable to continue (try -v)\n"))
15085
110d6804bfc6 mq: don't suppress patch tracebacks when applying patches
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 15057
diff changeset
   722
            self.ui.traceback()
14260
00a881581400 patch: make patch()/internalpatch() always update the dirstate
Patrick Mezard <pmezard@gmail.com>
parents: 14259
diff changeset
   723
            return (False, list(files), False)
2796
4c39568007f9 mq: codingstyle
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2795
diff changeset
   724
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
   725
    def apply(self, repo, series, list=False, update_status=True,
16634
435375cc0ca0 mq: backup local changes in qpush --force
Patrick Mezard <patrick@mezard.eu>
parents: 16633
diff changeset
   726
              strict=False, patchdir=None, merge=None, all_files=None,
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
   727
              tobackup=None, keepchanges=False):
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
   728
        wlock = lock = tr = None
4418
0532491f7476 MQ: tidy up if a qpush is interrupted.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4406
diff changeset
   729
        try:
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
   730
            wlock = repo.wlock()
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   731
            lock = repo.lock()
10881
a685011ed38e localrepo: add desc parameter to transaction
Steve Borho <steve@borho.org>
parents: 10873
diff changeset
   732
            tr = repo.transaction("qpush")
4418
0532491f7476 MQ: tidy up if a qpush is interrupted.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4406
diff changeset
   733
            try:
4970
30d4d8985dd8 transactions: avoid late tear-down (issue641)
Matt Mackall <mpm@selenic.com>
parents: 4917
diff changeset
   734
                ret = self._apply(repo, series, list, update_status,
16634
435375cc0ca0 mq: backup local changes in qpush --force
Patrick Mezard <patrick@mezard.eu>
parents: 16633
diff changeset
   735
                                  strict, patchdir, merge, all_files=all_files,
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
   736
                                  tobackup=tobackup, keepchanges=keepchanges)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   737
                tr.close()
14580
92101ea35015 mq: rename save_dirty to savedirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14579
diff changeset
   738
                self.savedirty()
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   739
                return ret
16654
490ed8972f1b mq: introduce qpush --check
Patrick Mezard <patrick@mezard.eu>
parents: 16653
diff changeset
   740
            except AbortNoCleanup:
490ed8972f1b mq: introduce qpush --check
Patrick Mezard <patrick@mezard.eu>
parents: 16653
diff changeset
   741
                tr.close()
490ed8972f1b mq: introduce qpush --check
Patrick Mezard <patrick@mezard.eu>
parents: 16653
diff changeset
   742
                self.savedirty()
490ed8972f1b mq: introduce qpush --check
Patrick Mezard <patrick@mezard.eu>
parents: 16653
diff changeset
   743
                return 2, repo.dirstate.p1()
16705
c2d9ef43ff6c check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents: 16699
diff changeset
   744
            except: # re-raises
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   745
                try:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   746
                    tr.abort()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   747
                finally:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   748
                    repo.invalidate()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   749
                    repo.dirstate.invalidate()
15881
3862369cf9b9 mq: use .invalidate to cancel dirty mq state when cancelling transaction
Mads Kiilerich <mads@kiilerich.com>
parents: 15880
diff changeset
   750
                    self.invalidate()
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   751
                raise
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
   752
        finally:
11230
5116a077c3da make transactions work on non-refcounted python implementations
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 11229
diff changeset
   753
            release(tr, 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
   754
            self.removeundo(repo)
4418
0532491f7476 MQ: tidy up if a qpush is interrupted.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4406
diff changeset
   755
4970
30d4d8985dd8 transactions: avoid late tear-down (issue641)
Matt Mackall <mpm@selenic.com>
parents: 4917
diff changeset
   756
    def _apply(self, repo, series, list=False, update_status=True,
16634
435375cc0ca0 mq: backup local changes in qpush --force
Patrick Mezard <patrick@mezard.eu>
parents: 16633
diff changeset
   757
               strict=False, patchdir=None, merge=None, all_files=None,
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
   758
               tobackup=None, keepchanges=False):
16634
435375cc0ca0 mq: backup local changes in qpush --force
Patrick Mezard <patrick@mezard.eu>
parents: 16633
diff changeset
   759
        """returns (error, hash)
435375cc0ca0 mq: backup local changes in qpush --force
Patrick Mezard <patrick@mezard.eu>
parents: 16633
diff changeset
   760
435375cc0ca0 mq: backup local changes in qpush --force
Patrick Mezard <patrick@mezard.eu>
parents: 16633
diff changeset
   761
        error = 1 for unable to read, 2 for patch failed, 3 for patch
435375cc0ca0 mq: backup local changes in qpush --force
Patrick Mezard <patrick@mezard.eu>
parents: 16633
diff changeset
   762
        fuzz. tobackup is None or a set of files to backup before they
435375cc0ca0 mq: backup local changes in qpush --force
Patrick Mezard <patrick@mezard.eu>
parents: 16633
diff changeset
   763
        are modified by a patch.
435375cc0ca0 mq: backup local changes in qpush --force
Patrick Mezard <patrick@mezard.eu>
parents: 16633
diff changeset
   764
        """
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   765
        # TODO unify with commands.py
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   766
        if not patchdir:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   767
            patchdir = self.path
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   768
        err = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   769
        n = None
2934
2f190e998eb3 Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents: 2922
diff changeset
   770
        for patchname in series:
2f190e998eb3 Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents: 2922
diff changeset
   771
            pushable, reason = self.pushable(patchname)
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   772
            if not pushable:
14579
f7b25764d974 mq: rename explain_pushable to explainpushable
Adrian Buehlmann <adrian@cadifra.com>
parents: 14578
diff changeset
   773
                self.explainpushable(patchname, all_patches=True)
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
   774
                continue
9111
ac3f1e6696eb mq: use ui.status when pushing and popping patches
Martin Geisler <mg@lazybytes.net>
parents: 9110
diff changeset
   775
            self.ui.status(_("applying %s\n") % patchname)
2934
2f190e998eb3 Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents: 2922
diff changeset
   776
            pf = os.path.join(patchdir, patchname)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   777
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   778
            try:
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
   779
                ph = patchheader(self.join(patchname), self.plainmode)
14239
967be4bb42a7 mq: loosen except clause when reading patch headers
Idan Kamara <idankk86@gmail.com>
parents: 14210
diff changeset
   780
            except IOError:
8875
801cacf46e62 mq: fix error message for qpush inexistent-patch (issue1702)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8833
diff changeset
   781
                self.ui.warn(_("unable to read %s\n") % patchname)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   782
                err = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   783
                break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   784
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
   785
            message = ph.message
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   786
            if not message:
12849
d966eb464888 mq: mark strings that should not be translated
Martin Geisler <mg@lazybytes.net>
parents: 12848
diff changeset
   787
                # The commit message should not be translated
10274
04207f5e7344 mq: Do not translate import message that are appended to commits.
David Soria Parra <dsp@php.net>
parents: 10263
diff changeset
   788
                message = "imported patch %s\n" % patchname
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   789
            else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   790
                if list:
12849
d966eb464888 mq: mark strings that should not be translated
Martin Geisler <mg@lazybytes.net>
parents: 12848
diff changeset
   791
                    # The commit message should not be translated
10274
04207f5e7344 mq: Do not translate import message that are appended to commits.
David Soria Parra <dsp@php.net>
parents: 10263
diff changeset
   792
                    message.append("\nimported patch %s" % patchname)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   793
                message = '\n'.join(message)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   794
7782
140429276b63 mq: handle empty patches more gracefully (issue1501)
Matt Mackall <mpm@selenic.com>
parents: 7772
diff changeset
   795
            if ph.haspatch:
16634
435375cc0ca0 mq: backup local changes in qpush --force
Patrick Mezard <patrick@mezard.eu>
parents: 16633
diff changeset
   796
                if tobackup:
435375cc0ca0 mq: backup local changes in qpush --force
Patrick Mezard <patrick@mezard.eu>
parents: 16633
diff changeset
   797
                    touched = patchmod.changedfiles(self.ui, repo, pf)
435375cc0ca0 mq: backup local changes in qpush --force
Patrick Mezard <patrick@mezard.eu>
parents: 16633
diff changeset
   798
                    touched = set(touched) & tobackup
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
   799
                    if touched and keepchanges:
16654
490ed8972f1b mq: introduce qpush --check
Patrick Mezard <patrick@mezard.eu>
parents: 16653
diff changeset
   800
                        raise AbortNoCleanup(
490ed8972f1b mq: introduce qpush --check
Patrick Mezard <patrick@mezard.eu>
parents: 16653
diff changeset
   801
                            _("local changes found, refresh first"))
16634
435375cc0ca0 mq: backup local changes in qpush --force
Patrick Mezard <patrick@mezard.eu>
parents: 16633
diff changeset
   802
                    self.backup(repo, touched, copy=True)
435375cc0ca0 mq: backup local changes in qpush --force
Patrick Mezard <patrick@mezard.eu>
parents: 16633
diff changeset
   803
                    tobackup = tobackup - touched
7782
140429276b63 mq: handle empty patches more gracefully (issue1501)
Matt Mackall <mpm@selenic.com>
parents: 7772
diff changeset
   804
                (patcherr, files, fuzz) = self.patch(repo, pf)
10661
c4859aad1980 mq: all_files can be a set, remove dangerous default values
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10611
diff changeset
   805
                if all_files is not None:
c4859aad1980 mq: all_files can be a set, remove dangerous default values
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10611
diff changeset
   806
                    all_files.update(files)
7782
140429276b63 mq: handle empty patches more gracefully (issue1501)
Matt Mackall <mpm@selenic.com>
parents: 7772
diff changeset
   807
                patcherr = not patcherr
140429276b63 mq: handle empty patches more gracefully (issue1501)
Matt Mackall <mpm@selenic.com>
parents: 7772
diff changeset
   808
            else:
140429276b63 mq: handle empty patches more gracefully (issue1501)
Matt Mackall <mpm@selenic.com>
parents: 7772
diff changeset
   809
                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
   810
                patcherr, files, fuzz = 0, [], 0
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   811
2934
2f190e998eb3 Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents: 2922
diff changeset
   812
            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
   813
                # 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
   814
                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
   815
                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
   816
                for f in files:
12344
b6173aee4a47 Use lexists() instead of exists() where appropriate
Patrick Mezard <pmezard@gmail.com>
parents: 12067
diff changeset
   817
                    if os.path.lexists(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
   818
                        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
   819
                    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
   820
                        removed.append(f)
4904
6fd953d5faea dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents: 4890
diff changeset
   821
                for f in removed:
6fd953d5faea dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents: 4890
diff changeset
   822
                    repo.dirstate.remove(f)
6fd953d5faea dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents: 4890
diff changeset
   823
                for f in merged:
6fd953d5faea dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents: 4890
diff changeset
   824
                    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
   825
                p1, p2 = repo.dirstate.parents()
16551
ebf6d38c9063 localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents: 16428
diff changeset
   826
                repo.setparents(p1, merge)
6603
41eb20cc1c02 match: remove files arg from repo.status and friends
Matt Mackall <mpm@selenic.com>
parents: 6602
diff changeset
   827
19638
20096384754f mq: update subrepos when applying / unapplying patches that change .hgsubstate
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19636
diff changeset
   828
            if all_files and '.hgsubstate' in all_files:
20096384754f mq: update subrepos when applying / unapplying patches that change .hgsubstate
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19636
diff changeset
   829
                wctx = repo['.']
20096384754f mq: update subrepos when applying / unapplying patches that change .hgsubstate
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19636
diff changeset
   830
                mctx = actx = repo[None]
20096384754f mq: update subrepos when applying / unapplying patches that change .hgsubstate
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19636
diff changeset
   831
                overwrite = False
20096384754f mq: update subrepos when applying / unapplying patches that change .hgsubstate
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19636
diff changeset
   832
                mergedsubstate = subrepo.submerge(repo, wctx, mctx, actx,
20096384754f mq: update subrepos when applying / unapplying patches that change .hgsubstate
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19636
diff changeset
   833
                    overwrite)
20096384754f mq: update subrepos when applying / unapplying patches that change .hgsubstate
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19636
diff changeset
   834
                files += mergedsubstate.keys()
20096384754f mq: update subrepos when applying / unapplying patches that change .hgsubstate
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19636
diff changeset
   835
14322
a90131b85fd8 scmutil: drop aliases in cmdutil for match functions
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
   836
            match = scmutil.matchfiles(repo, files or [])
16043
74d00b5d00cc qpush: avoid trying to manage existing history (issue2218)
Matt Mackall <mpm@selenic.com>
parents: 16040
diff changeset
   837
            oldtip = repo['tip']
16102
50682c07a8d0 merge with stable
Matt Mackall <mpm@selenic.com>
parents: 16065 16101
diff changeset
   838
            n = newcommit(repo, None, message, ph.user, ph.date, match=match,
50682c07a8d0 merge with stable
Matt Mackall <mpm@selenic.com>
parents: 16065 16101
diff changeset
   839
                          force=True)
16043
74d00b5d00cc qpush: avoid trying to manage existing history (issue2218)
Matt Mackall <mpm@selenic.com>
parents: 16040
diff changeset
   840
            if repo['tip'] == oldtip:
74d00b5d00cc qpush: avoid trying to manage existing history (issue2218)
Matt Mackall <mpm@selenic.com>
parents: 16040
diff changeset
   841
                raise util.Abort(_("qpush exactly duplicates child changeset"))
8527
f9a80054dd3c use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents: 8525
diff changeset
   842
            if n is None:
12850
62b334b0dfdf mq: expand 'repo' -> 'repository' in error message
Martin Geisler <mg@lazybytes.net>
parents: 12849
diff changeset
   843
                raise util.Abort(_("repository commit failed"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   844
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   845
            if update_status:
10678
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10663
diff changeset
   846
                self.applied.append(statusentry(n, patchname))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   847
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   848
            if patcherr:
7782
140429276b63 mq: handle empty patches more gracefully (issue1501)
Matt Mackall <mpm@selenic.com>
parents: 7772
diff changeset
   849
                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
   850
                err = 2
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   851
                break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   852
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   853
            if fuzz and strict:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
   854
                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
   855
                err = 3
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   856
                break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   857
        return (err, n)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
   858
8833
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   859
    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
   860
        if not keep:
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   861
            r = self.qrepo()
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   862
            if r:
14435
5f6090e559fa context: make forget work like commands.forget
Matt Mackall <mpm@selenic.com>
parents: 14434
diff changeset
   863
                r[None].forget(patches)
5f6090e559fa context: make forget work like commands.forget
Matt Mackall <mpm@selenic.com>
parents: 14434
diff changeset
   864
            for p in patches:
18067
6f62e005781d mq: don't fail when removing a patch without patch file from series file
Mads Kiilerich <mads@kiilerich.com>
parents: 18054
diff changeset
   865
                try:
6f62e005781d mq: don't fail when removing a patch without patch file from series file
Mads Kiilerich <mads@kiilerich.com>
parents: 18054
diff changeset
   866
                    os.unlink(self.join(p))
6f62e005781d mq: don't fail when removing a patch without patch file from series file
Mads Kiilerich <mads@kiilerich.com>
parents: 18054
diff changeset
   867
                except OSError, inst:
6f62e005781d mq: don't fail when removing a patch without patch file from series file
Mads Kiilerich <mads@kiilerich.com>
parents: 18054
diff changeset
   868
                    if inst.errno != errno.ENOENT:
6f62e005781d mq: don't fail when removing a patch without patch file from series file
Mads Kiilerich <mads@kiilerich.com>
parents: 18054
diff changeset
   869
                        raise
8833
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   870
15920
885e0c71db9b mq: turn changeset draft on qfinish (except if qparent is secret)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15883
diff changeset
   871
        qfinished = []
8833
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   872
        if numrevs:
14010
d7b4d421b56c mq: prevent traceback when qfinish patches not in series.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13970
diff changeset
   873
            qfinished = self.applied[:numrevs]
8833
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   874
            del self.applied[:numrevs]
15879
710e6bf15538 mq: consistently use boolean values for dirty flags
Mads Kiilerich <mads@kiilerich.com>
parents: 15878
diff changeset
   875
            self.applieddirty = True
8833
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   876
14010
d7b4d421b56c mq: prevent traceback when qfinish patches not in series.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13970
diff changeset
   877
        unknown = []
d7b4d421b56c mq: prevent traceback when qfinish patches not in series.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13970
diff changeset
   878
14574
12fba7bcb4f1 mq: rename find_series to findseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14573
diff changeset
   879
        for (i, p) in sorted([(self.findseries(p), p) for p in patches],
14010
d7b4d421b56c mq: prevent traceback when qfinish patches not in series.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13970
diff changeset
   880
                             reverse=True):
d7b4d421b56c mq: prevent traceback when qfinish patches not in series.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13970
diff changeset
   881
            if i is not None:
14572
8ff2957c1d82 mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14564
diff changeset
   882
                del self.fullseries[i]
14010
d7b4d421b56c mq: prevent traceback when qfinish patches not in series.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13970
diff changeset
   883
            else:
d7b4d421b56c mq: prevent traceback when qfinish patches not in series.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13970
diff changeset
   884
                unknown.append(p)
d7b4d421b56c mq: prevent traceback when qfinish patches not in series.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13970
diff changeset
   885
d7b4d421b56c mq: prevent traceback when qfinish patches not in series.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13970
diff changeset
   886
        if unknown:
d7b4d421b56c mq: prevent traceback when qfinish patches not in series.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13970
diff changeset
   887
            if numrevs:
d7b4d421b56c mq: prevent traceback when qfinish patches not in series.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13970
diff changeset
   888
                rev  = dict((entry.name, entry.node) for entry in qfinished)
d7b4d421b56c mq: prevent traceback when qfinish patches not in series.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13970
diff changeset
   889
                for p in unknown:
d7b4d421b56c mq: prevent traceback when qfinish patches not in series.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13970
diff changeset
   890
                    msg = _('revision %s refers to unknown patches: %s\n')
d7b4d421b56c mq: prevent traceback when qfinish patches not in series.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13970
diff changeset
   891
                    self.ui.warn(msg % (short(rev[p]), p))
d7b4d421b56c mq: prevent traceback when qfinish patches not in series.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13970
diff changeset
   892
            else:
d7b4d421b56c mq: prevent traceback when qfinish patches not in series.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13970
diff changeset
   893
                msg = _('unknown patches: %s\n')
d7b4d421b56c mq: prevent traceback when qfinish patches not in series.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13970
diff changeset
   894
                raise util.Abort(''.join(msg % p for p in unknown))
d7b4d421b56c mq: prevent traceback when qfinish patches not in series.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13970
diff changeset
   895
14575
845c864200d0 mq: rename parse_series to parseseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14574
diff changeset
   896
        self.parseseries()
15879
710e6bf15538 mq: consistently use boolean values for dirty flags
Mads Kiilerich <mads@kiilerich.com>
parents: 15878
diff changeset
   897
        self.seriesdirty = True
15920
885e0c71db9b mq: turn changeset draft on qfinish (except if qparent is secret)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15883
diff changeset
   898
        return [entry.node for entry in qfinished]
6645
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
   899
8833
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   900
    def _revpatches(self, repo, revs):
10678
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10663
diff changeset
   901
        firstrev = repo[self.applied[0].node].rev()
6645
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
   902
        patches = []
8833
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   903
        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
   904
6645
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
   905
            if rev < firstrev:
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
   906
                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
   907
6e6f5b80e056 mq: warn about finalizing patches without cset message
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8811
diff changeset
   908
            ctx = repo[rev]
10678
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10663
diff changeset
   909
            base = self.applied[i].node
8832
6e6f5b80e056 mq: warn about finalizing patches without cset message
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8811
diff changeset
   910
            if ctx.node() != base:
6e6f5b80e056 mq: warn about finalizing patches without cset message
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8811
diff changeset
   911
                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
   912
                raise util.Abort(msg % rev)
6e6f5b80e056 mq: warn about finalizing patches without cset message
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8811
diff changeset
   913
8833
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   914
            patch = self.applied[i].name
8832
6e6f5b80e056 mq: warn about finalizing patches without cset message
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8811
diff changeset
   915
            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
   916
                if ctx.description() == fmt % patch:
6e6f5b80e056 mq: warn about finalizing patches without cset message
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8811
diff changeset
   917
                    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
   918
                    repo.ui.status(msg % patch)
6e6f5b80e056 mq: warn about finalizing patches without cset message
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8811
diff changeset
   919
                    break
6e6f5b80e056 mq: warn about finalizing patches without cset message
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8811
diff changeset
   920
8833
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   921
            patches.append(patch)
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   922
        return patches
6645
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
   923
8833
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   924
    def finish(self, repo, revs):
16029
ee1c8385e5b0 qfinish: do not set secret changeset to draft if mq.secret=false
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16028
diff changeset
   925
        # Manually trigger phase computation to ensure phasedefaults is
ee1c8385e5b0 qfinish: do not set secret changeset to draft if mq.secret=false
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16028
diff changeset
   926
        # executed before we remove the patches.
16657
b6081c2c4647 phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents: 16656
diff changeset
   927
        repo._phasecache
8833
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   928
        patches = self._revpatches(repo, sorted(revs))
15920
885e0c71db9b mq: turn changeset draft on qfinish (except if qparent is secret)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15883
diff changeset
   929
        qfinished = self._cleanup(patches, len(patches))
16029
ee1c8385e5b0 qfinish: do not set secret changeset to draft if mq.secret=false
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16028
diff changeset
   930
        if qfinished and repo.ui.configbool('mq', 'secret', False):
ee1c8385e5b0 qfinish: do not set secret changeset to draft if mq.secret=false
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16028
diff changeset
   931
            # only use this logic when the secret option is added
15920
885e0c71db9b mq: turn changeset draft on qfinish (except if qparent is secret)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15883
diff changeset
   932
            oldqbase = repo[qfinished[0]]
16290
9518cb55c822 qfinish: comply with the phases.new-commit option in secret mode (issue3335)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 16278
diff changeset
   933
            tphase = repo.ui.config('phases', 'new-commit', phases.draft)
9518cb55c822 qfinish: comply with the phases.new-commit option in secret mode (issue3335)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 16278
diff changeset
   934
            if oldqbase.phase() > tphase and oldqbase.p1().phase() <= tphase:
9518cb55c822 qfinish: comply with the phases.new-commit option in secret mode (issue3335)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 16278
diff changeset
   935
                phases.advanceboundary(repo, tphase, qfinished)
6645
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
   936
3088
dc784839516d mq: add qdelete --forget option
Brendan Cully <brendan@kublai.com>
parents: 3087
diff changeset
   937
    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
   938
        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
   939
            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
   940
                               'patch name'))
4736
04b2c1e27c26 mq: require patch argument or revision for qdelete
Brendan Cully <brendan@kublai.com>
parents: 4730
diff changeset
   941
11365
c3d7daa0928e mq: make 'qdelete <patchidx>' work again.
Greg Ward <greg-hg@gerg.ca>
parents: 11327
diff changeset
   942
        realpatches = []
2905
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2904
diff changeset
   943
        for patch in patches:
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2904
diff changeset
   944
            patch = self.lookup(patch, strict=True)
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2904
diff changeset
   945
            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
   946
            if info:
2905
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2904
diff changeset
   947
                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
   948
            if patch not in self.series:
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2904
diff changeset
   949
                raise util.Abort(_("patch %s not in series file") % patch)
12655
5192b24f309c mq: handle deleting the same patch twice in one command (issue2427)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12590
diff changeset
   950
            if patch not in realpatches:
5192b24f309c mq: handle deleting the same patch twice in one command (issue2427)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12590
diff changeset
   951
                realpatches.append(patch)
3373
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   952
8833
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   953
        numrevs = 0
3373
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   954
        if opts.get('rev'):
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   955
            if not self.applied:
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   956
                raise util.Abort(_('no patches applied'))
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14298
diff changeset
   957
            revs = scmutil.revrange(repo, opts.get('rev'))
3373
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
   958
            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
   959
                revs.reverse()
8833
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   960
            revpatches = self._revpatches(repo, revs)
11365
c3d7daa0928e mq: make 'qdelete <patchidx>' work again.
Greg Ward <greg-hg@gerg.ca>
parents: 11327
diff changeset
   961
            realpatches += revpatches
8833
14639c050251 mq: unify code for qdel -r and qfin
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8832
diff changeset
   962
            numrevs = len(revpatches)
2905
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2904
diff changeset
   963
11365
c3d7daa0928e mq: make 'qdelete <patchidx>' work again.
Greg Ward <greg-hg@gerg.ca>
parents: 11327
diff changeset
   964
        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
   965
14581
da40ee1adc2b mq: rename check_toppatch to checktoppatch
Adrian Buehlmann <adrian@cadifra.com>
parents: 14580
diff changeset
   966
    def checktoppatch(self, repo):
18343
cfa731b45b75 mq: checktoppatch should only check if p1 is qtip
Mads Kiilerich <mads@kiilerich.com>
parents: 18342
diff changeset
   967
        '''check that working directory is at qtip'''
10686
0c68c2c36ed8 mq: don't use len(list) unless necessary
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10685
diff changeset
   968
        if self.applied:
10678
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10663
diff changeset
   969
            top = self.applied[-1].node
10191
99d285ac5da4 mq: qdiff with the same diff options than qrefresh (issue1350)
Patrick Mezard <pmezard@gmail.com>
parents: 10190
diff changeset
   970
            patch = self.applied[-1].name
18343
cfa731b45b75 mq: checktoppatch should only check if p1 is qtip
Mads Kiilerich <mads@kiilerich.com>
parents: 18342
diff changeset
   971
            if repo.dirstate.p1() != top:
5432
bfbd9b954315 mq: clarify queue top message
Matt Mackall <mpm@selenic.com>
parents: 5336
diff changeset
   972
                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
   973
            return top, patch
99d285ac5da4 mq: qdiff with the same diff options than qrefresh (issue1350)
Patrick Mezard <pmezard@gmail.com>
parents: 10190
diff changeset
   974
        return None, None
99d285ac5da4 mq: qdiff with the same diff options than qrefresh (issue1350)
Patrick Mezard <pmezard@gmail.com>
parents: 10190
diff changeset
   975
17152
f287d4a62031 mq: create patch file after commit to import diff of ".hgsubstate" at qrefresh
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17151
diff changeset
   976
    def putsubstate2changes(self, substatestate, changes):
f287d4a62031 mq: create patch file after commit to import diff of ".hgsubstate" at qrefresh
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17151
diff changeset
   977
        for files in changes[:3]:
f287d4a62031 mq: create patch file after commit to import diff of ".hgsubstate" at qrefresh
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17151
diff changeset
   978
            if '.hgsubstate' in files:
f287d4a62031 mq: create patch file after commit to import diff of ".hgsubstate" at qrefresh
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17151
diff changeset
   979
                return # already listed up
f287d4a62031 mq: create patch file after commit to import diff of ".hgsubstate" at qrefresh
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17151
diff changeset
   980
        # not yet listed up
f287d4a62031 mq: create patch file after commit to import diff of ".hgsubstate" at qrefresh
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17151
diff changeset
   981
        if substatestate in 'a?':
f287d4a62031 mq: create patch file after commit to import diff of ".hgsubstate" at qrefresh
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17151
diff changeset
   982
            changes[1].append('.hgsubstate')
f287d4a62031 mq: create patch file after commit to import diff of ".hgsubstate" at qrefresh
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17151
diff changeset
   983
        elif substatestate in 'r':
f287d4a62031 mq: create patch file after commit to import diff of ".hgsubstate" at qrefresh
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17151
diff changeset
   984
            changes[2].append('.hgsubstate')
f287d4a62031 mq: create patch file after commit to import diff of ".hgsubstate" at qrefresh
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17151
diff changeset
   985
        else: # modified
f287d4a62031 mq: create patch file after commit to import diff of ".hgsubstate" at qrefresh
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17151
diff changeset
   986
            changes[0].append('.hgsubstate')
f287d4a62031 mq: create patch file after commit to import diff of ".hgsubstate" at qrefresh
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17151
diff changeset
   987
19812
5d6cfdc38a3d mq: simplifies the refresh hint in checklocalchanges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19763
diff changeset
   988
    def checklocalchanges(self, repo, force=False, refresh=True):
5d6cfdc38a3d mq: simplifies the refresh hint in checklocalchanges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19763
diff changeset
   989
        excsuffix = ''
14256
d04ba50e104d mq: allow to qpop/push with a dirty working copy (issue2780)
Idan Kamara <idankk86@gmail.com>
parents: 14241
diff changeset
   990
        if refresh:
19812
5d6cfdc38a3d mq: simplifies the refresh hint in checklocalchanges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19763
diff changeset
   991
            excsuffix = ', refresh first'
5d6cfdc38a3d mq: simplifies the refresh hint in checklocalchanges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19763
diff changeset
   992
            # plain versions for i18n tool to detect them
5d6cfdc38a3d mq: simplifies the refresh hint in checklocalchanges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19763
diff changeset
   993
            _("local changes found, refresh first")
5d6cfdc38a3d mq: simplifies the refresh hint in checklocalchanges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19763
diff changeset
   994
            _("local changed subrepos found, refresh first")
19814
4495c6a272e0 mq: extract checklocalchanges from `mq.queue`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19813
diff changeset
   995
        return checklocalchanges(repo, force, excsuffix)
4713
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
   996
14051
2b1226693c70 mq: add '.' and '..' to list of forbidden patch names
Idan Kamara <idankk86@gmail.com>
parents: 13791
diff changeset
   997
    _reserved = ('series', 'status', 'guards', '.', '..')
14584
3343a74eea4e mq: rename check_reserved_name to checkreservedname
Adrian Buehlmann <adrian@cadifra.com>
parents: 14583
diff changeset
   998
    def checkreservedname(self, name):
14054
3c616f512a5b mq: be more explicit on invalid patch name message
Idan Kamara <idankk86@gmail.com>
parents: 14052
diff changeset
   999
        if name in self._reserved:
5981
ca2af0c81c9a mq: don't allow patches with some reserved names
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5980
diff changeset
  1000
            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
  1001
                             % name)
14054
3c616f512a5b mq: be more explicit on invalid patch name message
Idan Kamara <idankk86@gmail.com>
parents: 14052
diff changeset
  1002
        for prefix in ('.hg', '.mq'):
3c616f512a5b mq: be more explicit on invalid patch name message
Idan Kamara <idankk86@gmail.com>
parents: 14052
diff changeset
  1003
            if name.startswith(prefix):
3c616f512a5b mq: be more explicit on invalid patch name message
Idan Kamara <idankk86@gmail.com>
parents: 14052
diff changeset
  1004
                raise util.Abort(_('patch name cannot begin with "%s"')
3c616f512a5b mq: be more explicit on invalid patch name message
Idan Kamara <idankk86@gmail.com>
parents: 14052
diff changeset
  1005
                                 % prefix)
3c616f512a5b mq: be more explicit on invalid patch name message
Idan Kamara <idankk86@gmail.com>
parents: 14052
diff changeset
  1006
        for c in ('#', ':'):
3c616f512a5b mq: be more explicit on invalid patch name message
Idan Kamara <idankk86@gmail.com>
parents: 14052
diff changeset
  1007
            if c in name:
3c616f512a5b mq: be more explicit on invalid patch name message
Idan Kamara <idankk86@gmail.com>
parents: 14052
diff changeset
  1008
                raise util.Abort(_('"%s" cannot be used in the name of a patch')
3c616f512a5b mq: be more explicit on invalid patch name message
Idan Kamara <idankk86@gmail.com>
parents: 14052
diff changeset
  1009
                                 % c)
3c616f512a5b mq: be more explicit on invalid patch name message
Idan Kamara <idankk86@gmail.com>
parents: 14052
diff changeset
  1010
14422
2e77525e52d9 mq: wrap patch file name checks in a function
Idan Kamara <idankk86@gmail.com>
parents: 14396
diff changeset
  1011
    def checkpatchname(self, name, force=False):
14584
3343a74eea4e mq: rename check_reserved_name to checkreservedname
Adrian Buehlmann <adrian@cadifra.com>
parents: 14583
diff changeset
  1012
        self.checkreservedname(name)
14422
2e77525e52d9 mq: wrap patch file name checks in a function
Idan Kamara <idankk86@gmail.com>
parents: 14396
diff changeset
  1013
        if not force and os.path.exists(self.join(name)):
2e77525e52d9 mq: wrap patch file name checks in a function
Idan Kamara <idankk86@gmail.com>
parents: 14396
diff changeset
  1014
            if os.path.isdir(self.join(name)):
2e77525e52d9 mq: wrap patch file name checks in a function
Idan Kamara <idankk86@gmail.com>
parents: 14396
diff changeset
  1015
                raise util.Abort(_('"%s" already exists as a directory')
2e77525e52d9 mq: wrap patch file name checks in a function
Idan Kamara <idankk86@gmail.com>
parents: 14396
diff changeset
  1016
                                 % name)
2e77525e52d9 mq: wrap patch file name checks in a function
Idan Kamara <idankk86@gmail.com>
parents: 14396
diff changeset
  1017
            else:
2e77525e52d9 mq: wrap patch file name checks in a function
Idan Kamara <idankk86@gmail.com>
parents: 14396
diff changeset
  1018
                raise util.Abort(_('patch "%s" already exists') % name)
5981
ca2af0c81c9a mq: don't allow patches with some reserved names
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5980
diff changeset
  1019
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  1020
    def checkkeepchanges(self, keepchanges, force):
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  1021
        if force and keepchanges:
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  1022
            raise util.Abort(_('cannot use both --force and --keep-changes'))
16654
490ed8972f1b mq: introduce qpush --check
Patrick Mezard <patrick@mezard.eu>
parents: 16653
diff changeset
  1023
7162
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
  1024
    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
  1025
        """options:
fd3cba5e73ae mq: do not invoke editor until just before patch creation. Closes issue1346.
Brendan Cully <brendan@kublai.com>
parents: 7142
diff changeset
  1026
           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
  1027
        """
4713
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
  1028
        msg = opts.get('msg')
5673
dd3ce7515f4d mq: add --currentuser and --user options to qnew and qrefresh
peter.arrenbrecht@gmail.com
parents: 5645
diff changeset
  1029
        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
  1030
        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
  1031
        if date:
989467e8e3a9 Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6120
diff changeset
  1032
            date = util.parsedate(date)
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
  1033
        diffopts = self.diffopts({'git': opts.get('git')})
14424
4eb88d296f63 record: check patch name is valid before prompting in qrecord
Idan Kamara <idankk86@gmail.com>
parents: 14423
diff changeset
  1034
        if opts.get('checkname', True):
4eb88d296f63 record: check patch name is valid before prompting in qrecord
Idan Kamara <idankk86@gmail.com>
parents: 14423
diff changeset
  1035
            self.checkpatchname(patchfn)
19813
76796fe65bad mq: extract checksubstate from the queue class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19812
diff changeset
  1036
        inclsubs = checksubstate(repo)
13174
be7e8e9bc5e5 mq: update .hgsubstate if subrepos are clean (issue2499)
Kevin Bullock <kbullock@ringworld.org>
parents: 13173
diff changeset
  1037
        if inclsubs:
be7e8e9bc5e5 mq: update .hgsubstate if subrepos are clean (issue2499)
Kevin Bullock <kbullock@ringworld.org>
parents: 13173
diff changeset
  1038
            inclsubs.append('.hgsubstate')
16366
913d1fa61398 mq: use list of already known target files instead of matching object for diff
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16365
diff changeset
  1039
            substatestate = repo.dirstate['.hgsubstate']
4713
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
  1040
        if opts.get('include') or opts.get('exclude') or pats:
13174
be7e8e9bc5e5 mq: update .hgsubstate if subrepos are clean (issue2499)
Kevin Bullock <kbullock@ringworld.org>
parents: 13173
diff changeset
  1041
            if inclsubs:
be7e8e9bc5e5 mq: update .hgsubstate if subrepos are clean (issue2499)
Kevin Bullock <kbullock@ringworld.org>
parents: 13173
diff changeset
  1042
                pats = list(pats or []) + inclsubs
14671
35c2cc322ba8 scmutil: switch match users to supplying contexts
Matt Mackall <mpm@selenic.com>
parents: 14636
diff changeset
  1043
            match = scmutil.match(repo[None], 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
  1044
            # 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
  1045
            def badfn(f, msg):
13174
be7e8e9bc5e5 mq: update .hgsubstate if subrepos are clean (issue2499)
Kevin Bullock <kbullock@ringworld.org>
parents: 13173
diff changeset
  1046
                if f != '.hgsubstate': # .hgsubstate is auto-created
be7e8e9bc5e5 mq: update .hgsubstate if subrepos are clean (issue2499)
Kevin Bullock <kbullock@ringworld.org>
parents: 13173
diff changeset
  1047
                    raise util.Abort('%s: %s' % (f, msg))
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
  1048
            match.bad = badfn
16366
913d1fa61398 mq: use list of already known target files instead of matching object for diff
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16365
diff changeset
  1049
            changes = repo.status(match=match)
913d1fa61398 mq: use list of already known target files instead of matching object for diff
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16365
diff changeset
  1050
            m, a, r, d = changes[:4]
4713
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
  1051
        else:
16366
913d1fa61398 mq: use list of already known target files instead of matching object for diff
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16365
diff changeset
  1052
            changes = self.checklocalchanges(repo, force=True)
913d1fa61398 mq: use list of already known target files instead of matching object for diff
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16365
diff changeset
  1053
            m, a, r, d = changes
16365
5d61e007d957 mq: use exact matching in the second dirstate walking for efficiency of 'qnew'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16318
diff changeset
  1054
        match = scmutil.matchfiles(repo, m + a + r + inclsubs)
10372
27d542bc0f5b qnew: ignore force option
Augie Fackler <durin42@gmail.com>
parents: 10370
diff changeset
  1055
        if len(repo[None].parents()) > 1:
27d542bc0f5b qnew: ignore force option
Augie Fackler <durin42@gmail.com>
parents: 10370
diff changeset
  1056
            raise util.Abort(_('cannot manage merge changesets'))
2875
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
  1057
        commitfiles = m + a + r
14581
da40ee1adc2b mq: rename check_toppatch to checktoppatch
Adrian Buehlmann <adrian@cadifra.com>
parents: 14580
diff changeset
  1058
        self.checktoppatch(repo)
14585
74bf9c84cfd0 mq: rename full_series_end to fullseriesend
Adrian Buehlmann <adrian@cadifra.com>
parents: 14584
diff changeset
  1059
        insert = self.fullseriesend()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1060
        wlock = repo.wlock()
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1061
        try:
12878
1634287b6ab1 qnew: give better feedback when doing 'hg qnew foo/' (issue2464)
Martin Geisler <mg@aragost.com>
parents: 12875
diff changeset
  1062
            try:
1634287b6ab1 qnew: give better feedback when doing 'hg qnew foo/' (issue2464)
Martin Geisler <mg@aragost.com>
parents: 12875
diff changeset
  1063
                # if patch file write fails, abort early
1634287b6ab1 qnew: give better feedback when doing 'hg qnew foo/' (issue2464)
Martin Geisler <mg@aragost.com>
parents: 12875
diff changeset
  1064
                p = self.opener(patchfn, "w")
1634287b6ab1 qnew: give better feedback when doing 'hg qnew foo/' (issue2464)
Martin Geisler <mg@aragost.com>
parents: 12875
diff changeset
  1065
            except IOError, e:
1634287b6ab1 qnew: give better feedback when doing 'hg qnew foo/' (issue2464)
Martin Geisler <mg@aragost.com>
parents: 12875
diff changeset
  1066
                raise util.Abort(_('cannot write patch "%s": %s')
1634287b6ab1 qnew: give better feedback when doing 'hg qnew foo/' (issue2464)
Martin Geisler <mg@aragost.com>
parents: 12875
diff changeset
  1067
                                 % (patchfn, e.strerror))
7162
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
  1068
            try:
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
  1069
                if self.plainmode:
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
  1070
                    if user:
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
  1071
                        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
  1072
                        if not date:
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
  1073
                            p.write("\n")
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
  1074
                    if date:
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
  1075
                        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
  1076
                else:
7162
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
  1077
                    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
  1078
                    p.write("# Parent "
13878
a8d13ee0ce68 misc: replace .parents()[0] with p1()
Matt Mackall <mpm@selenic.com>
parents: 13793
diff changeset
  1079
                            + hex(repo[None].p1().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
  1080
                    if user:
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
  1081
                        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
  1082
                    if date:
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
  1083
                        p.write("# Date %s %s\n\n" % date)
14943
d3bb825ddae3 globally: use safehasattr(x, '__call__') instead of hasattr(x, '__call__')
Augie Fackler <durin42@gmail.com>
parents: 14732
diff changeset
  1084
                if util.safehasattr(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
  1085
                    msg = msg()
20768
57d0c8c3b947 qnew: save manually edited commit message into ".hg/last-message.txt"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20119
diff changeset
  1086
                    repo.savecommitmessage(msg)
7162
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
  1087
                commitmsg = msg and msg or ("[mq]: %s" % patchfn)
16102
50682c07a8d0 merge with stable
Matt Mackall <mpm@selenic.com>
parents: 16065 16101
diff changeset
  1088
                n = newcommit(repo, None, commitmsg, user, date, match=match,
50682c07a8d0 merge with stable
Matt Mackall <mpm@selenic.com>
parents: 16065 16101
diff changeset
  1089
                              force=True)
8527
f9a80054dd3c use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents: 8525
diff changeset
  1090
                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
  1091
                    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
  1092
                try:
14572
8ff2957c1d82 mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14564
diff changeset
  1093
                    self.fullseries[insert:insert] = [patchfn]
10678
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10663
diff changeset
  1094
                    self.applied.append(statusentry(n, patchfn))
14575
845c864200d0 mq: rename parse_series to parseseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14574
diff changeset
  1095
                    self.parseseries()
15879
710e6bf15538 mq: consistently use boolean values for dirty flags
Mads Kiilerich <mads@kiilerich.com>
parents: 15878
diff changeset
  1096
                    self.seriesdirty = True
710e6bf15538 mq: consistently use boolean values for dirty flags
Mads Kiilerich <mads@kiilerich.com>
parents: 15878
diff changeset
  1097
                    self.applieddirty = True
7162
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
  1098
                    if msg:
7614
f9fcb189c8e2 mq: make qnew patch format consistent with qrefresh (issue1457)
Bernhard Leiner <bleiner@gmail.com>
parents: 7568
diff changeset
  1099
                        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
  1100
                        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
  1101
                    if commitfiles:
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
  1102
                        parent = self.qparents(repo, n)
16366
913d1fa61398 mq: use list of already known target files instead of matching object for diff
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16365
diff changeset
  1103
                        if inclsubs:
17152
f287d4a62031 mq: create patch file after commit to import diff of ".hgsubstate" at qrefresh
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17151
diff changeset
  1104
                            self.putsubstate2changes(substatestate, changes)
14241
45f7aa35f2fd mq: don't hide the patch module
Idan Kamara <idankk86@gmail.com>
parents: 14239
diff changeset
  1105
                        chunks = patchmod.diff(repo, node1=parent, node2=n,
16366
913d1fa61398 mq: use list of already known target files instead of matching object for diff
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16365
diff changeset
  1106
                                               changes=changes, opts=diffopts)
7308
b6f5490effbf patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7307
diff changeset
  1107
                        for chunk in chunks:
b6f5490effbf patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7307
diff changeset
  1108
                            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
  1109
                    p.close()
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
  1110
                    r = self.qrepo()
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  1111
                    if r:
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11302
diff changeset
  1112
                        r[None].add([patchfn])
16705
c2d9ef43ff6c check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents: 16699
diff changeset
  1113
                except: # re-raises
7162
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
  1114
                    repo.rollback()
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
  1115
                    raise
7280
810ca383da9c remove unused variables
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7271
diff changeset
  1116
            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
  1117
                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
  1118
                try:
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
  1119
                    os.unlink(patchpath)
16688
cfb6682961b8 cleanup: replace naked excepts with more specific ones
Brodie Rao <brodie@sf.io>
parents: 16687
diff changeset
  1120
                except OSError:
7162
ce10a2f22258 mq: heavy rearrangement of qnew to make it recover reliably from errors.
Brendan Cully <brendan@kublai.com>
parents: 7161
diff changeset
  1121
                    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
  1122
                raise
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1123
            self.removeundo(repo)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1124
        finally:
8112
6ee71f78497c switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8076
diff changeset
  1125
            release(wlock)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1126
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1127
    def isapplied(self, patch):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1128
        """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
  1129
        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
  1130
            if a.name == patch:
10678
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10663
diff changeset
  1131
                return (i, a.node, a.name)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1132
        return None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1133
3223
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3186
diff changeset
  1134
    # 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
  1135
    # variations.  If strict is passed, we try only #1
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1136
    #
15256
8caf7a757afa mq: fix corner cases for handling of patch 0 in qselect
Mads Kiilerich <mads@kiilerich.com>
parents: 15148
diff changeset
  1137
    # 1) a number (as string) to indicate an offset in the series file
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1138
    # 2) a unique substring of the patch name was given
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1139
    # 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
  1140
    def lookup(self, patch, strict=False):
14595
f2c9d4091e0e mq: rename partial_name to partialname
Adrian Buehlmann <adrian@cadifra.com>
parents: 14594
diff changeset
  1141
        def partialname(s):
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1142
            if s in self.series:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1143
                return s
2765
0327bd1c831c mq: print matches if patch name not unique
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2757
diff changeset
  1144
            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
  1145
            if len(matches) > 1:
0327bd1c831c mq: print matches if patch name not unique
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2757
diff changeset
  1146
                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
  1147
                for m in matches:
0327bd1c831c mq: print matches if patch name not unique
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2757
diff changeset
  1148
                    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
  1149
                return None
0327bd1c831c mq: print matches if patch name not unique
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2757
diff changeset
  1150
            if matches:
0327bd1c831c mq: print matches if patch name not unique
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2757
diff changeset
  1151
                return matches[0]
10686
0c68c2c36ed8 mq: don't use len(list) unless necessary
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10685
diff changeset
  1152
            if self.series and self.applied:
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1153
                if s == 'qtip':
18054
b35e3364f94a check-code: there must also be whitespace between ')' and operator
Mads Kiilerich <madski@unity3d.com>
parents: 18011
diff changeset
  1154
                    return self.series[self.seriesend(True) - 1]
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1155
                if s == 'qbase':
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1156
                    return self.series[0]
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1157
            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
  1158
12df451ce205 mq: don't warn about ambiguous patch name when using patch index (issue1439)
Jason Orendorff <jorendorff@mozilla.com>
parents: 7566
diff changeset
  1159
        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
  1160
            return patch
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1161
2819
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
  1162
        if not os.path.isfile(self.join(patch)):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1163
            try:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1164
                sno = int(patch)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  1165
            except (ValueError, OverflowError):
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1166
                pass
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1167
            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
  1168
                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
  1169
                    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
  1170
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1171
            if not strict:
14595
f2c9d4091e0e mq: rename partial_name to partialname
Adrian Buehlmann <adrian@cadifra.com>
parents: 14594
diff changeset
  1172
                res = partialname(patch)
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1173
                if res:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1174
                    return res
3082
bed7cb835d8d Fixed python2.3 incompatibility (rsplit) in qpush/qpop with index.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3076
diff changeset
  1175
                minus = patch.rfind('-')
bed7cb835d8d Fixed python2.3 incompatibility (rsplit) in qpush/qpop with index.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3076
diff changeset
  1176
                if minus >= 0:
14595
f2c9d4091e0e mq: rename partial_name to partialname
Adrian Buehlmann <adrian@cadifra.com>
parents: 14594
diff changeset
  1177
                    res = partialname(patch[:minus])
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1178
                    if res:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1179
                        i = self.series.index(res)
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1180
                        try:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  1181
                            off = int(patch[minus + 1:] or 1)
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  1182
                        except (ValueError, OverflowError):
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1183
                            pass
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1184
                        else:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1185
                            if i - off >= 0:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1186
                                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
  1187
                plus = patch.rfind('+')
bed7cb835d8d Fixed python2.3 incompatibility (rsplit) in qpush/qpop with index.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3076
diff changeset
  1188
                if plus >= 0:
14595
f2c9d4091e0e mq: rename partial_name to partialname
Adrian Buehlmann <adrian@cadifra.com>
parents: 14594
diff changeset
  1189
                    res = partialname(patch[:plus])
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1190
                    if res:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1191
                        i = self.series.index(res)
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1192
                        try:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  1193
                            off = int(patch[plus + 1:] or 1)
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  1194
                        except (ValueError, OverflowError):
2696
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1195
                            pass
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1196
                        else:
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1197
                            if i + off < len(self.series):
be273f6074de mq: patch naming shortcuts
Chris Mason <mason@suse.com>
parents: 2694
diff changeset
  1198
                                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
  1199
        raise util.Abort(_("patch %s not in series") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1200
16654
490ed8972f1b mq: introduce qpush --check
Patrick Mezard <patrick@mezard.eu>
parents: 16653
diff changeset
  1201
    def push(self, repo, patch=None, force=False, list=False, mergeq=None,
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  1202
             all=False, move=False, exact=False, nobackup=False,
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  1203
             keepchanges=False):
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  1204
        self.checkkeepchanges(keepchanges, force)
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
  1205
        diffopts = self.diffopts()
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
  1206
        wlock = repo.wlock()
8795
51c29aec0b75 mq: eliminate warning on qpush with empty series
Adrian Buehlmann <adrian@cadifra.com>
parents: 8778
diff changeset
  1207
        try:
20119
1648e44edd8d mq: prefer a loop to a double-for list comprehension
Kevin Bullock <kbullock@ringworld.org>
parents: 20053
diff changeset
  1208
            heads = []
1648e44edd8d mq: prefer a loop to a double-for list comprehension
Kevin Bullock <kbullock@ringworld.org>
parents: 20053
diff changeset
  1209
            for hs in repo.branchmap().itervalues():
1648e44edd8d mq: prefer a loop to a double-for list comprehension
Kevin Bullock <kbullock@ringworld.org>
parents: 20053
diff changeset
  1210
                heads.extend(hs)
10362
2e3ec7ef5349 mq: don't warn on qpush against a branch head
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10361
diff changeset
  1211
            if not heads:
2e3ec7ef5349 mq: don't warn on qpush against a branch head
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10361
diff changeset
  1212
                heads = [nullid]
13878
a8d13ee0ce68 misc: replace .parents()[0] with p1()
Matt Mackall <mpm@selenic.com>
parents: 13793
diff changeset
  1213
            if repo.dirstate.p1() not in heads and not exact:
8795
51c29aec0b75 mq: eliminate warning on qpush with empty series
Adrian Buehlmann <adrian@cadifra.com>
parents: 8778
diff changeset
  1214
                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
  1215
8795
51c29aec0b75 mq: eliminate warning on qpush with empty series
Adrian Buehlmann <adrian@cadifra.com>
parents: 8778
diff changeset
  1216
            if not self.series:
51c29aec0b75 mq: eliminate warning on qpush with empty series
Adrian Buehlmann <adrian@cadifra.com>
parents: 8778
diff changeset
  1217
                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
  1218
                return 0
7398
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1219
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1220
            # 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
  1221
            # 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
  1222
            # 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
  1223
            # go backwards with qpush)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1224
            if patch:
15257
a8555f9908d1 mq: cleanup of lookup - handling of None is not relevant
Mads Kiilerich <mads@kiilerich.com>
parents: 15256
diff changeset
  1225
                patch = self.lookup(patch)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1226
                info = self.isapplied(patch)
13369
69238d0ca60f mq: catch attempt to qpush to an earlier patch (issue2587)
Afuna <afunamatata@gmail.com>
parents: 13224
diff changeset
  1227
                if info and info[0] >= len(self.applied) - 1:
7398
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1228
                    self.ui.warn(
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1229
                        _('qpush: %s is already at the top\n') % patch)
11439
778377be3662 mq: explicit exit code when patch is already on top
Gilles Moris <gilles.moris@free.fr>
parents: 11438
diff changeset
  1230
                    return 0
13369
69238d0ca60f mq: catch attempt to qpush to an earlier patch (issue2587)
Afuna <afunamatata@gmail.com>
parents: 13224
diff changeset
  1231
7398
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1232
                pushable, reason = self.pushable(patch)
13369
69238d0ca60f mq: catch attempt to qpush to an earlier patch (issue2587)
Afuna <afunamatata@gmail.com>
parents: 13224
diff changeset
  1233
                if pushable:
14586
af91cb281975 mq: rename series_end to seriesend
Adrian Buehlmann <adrian@cadifra.com>
parents: 14585
diff changeset
  1234
                    if self.series.index(patch) < self.seriesend():
13369
69238d0ca60f mq: catch attempt to qpush to an earlier patch (issue2587)
Afuna <afunamatata@gmail.com>
parents: 13224
diff changeset
  1235
                        raise util.Abort(
69238d0ca60f mq: catch attempt to qpush to an earlier patch (issue2587)
Afuna <afunamatata@gmail.com>
parents: 13224
diff changeset
  1236
                            _("cannot push to a previous patch: %s") % patch)
69238d0ca60f mq: catch attempt to qpush to an earlier patch (issue2587)
Afuna <afunamatata@gmail.com>
parents: 13224
diff changeset
  1237
                else:
7398
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1238
                    if reason:
14464
00256f689f9c mq: print "'foo' 'bar'", not "['foo', 'bar']" when showing guards
Martin Geisler <mg@aragost.com>
parents: 14448
diff changeset
  1239
                        reason = _('guarded by %s') % reason
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1240
                    else:
7398
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1241
                        reason = _('no matching guards')
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1242
                    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
  1243
                    return 1
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1244
            elif all:
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1245
                patch = self.series[-1]
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1246
                if self.isapplied(patch):
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1247
                    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
  1248
                    return 0
4100
c30c922f907a Modify qpush/qpop idempotent operations to return success
Ben Thomas <bthomas@virtualiron.com>
parents: 4099
diff changeset
  1249
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1250
            # 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
  1251
            # 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
  1252
            # 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
  1253
            # 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
  1254
            # work as it detects an error when done
14586
af91cb281975 mq: rename series_end to seriesend
Adrian Buehlmann <adrian@cadifra.com>
parents: 14585
diff changeset
  1255
            start = self.seriesend()
7398
2cd1308cb588 mq: gracefully abort qpush/qgoto to guarded patch (issue1186)
Brendan Cully <brendan@kublai.com>
parents: 7308
diff changeset
  1256
            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
  1257
                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
  1258
                return 1
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  1259
            if not force and not keepchanges:
14732
e9ed3506f066 backout of d04ba50e104d: allow to qpop/push with a dirty working copy
Idan Kamara <idankk86@gmail.com>
parents: 14671
diff changeset
  1260
                self.checklocalchanges(repo, refresh=self.applied)
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1261
13033
026053f691a4 mq: add an '-e/--exact' option to qpush
Steve Losh <steve@stevelosh.com>
parents: 13031
diff changeset
  1262
            if exact:
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  1263
                if keepchanges:
16654
490ed8972f1b mq: introduce qpush --check
Patrick Mezard <patrick@mezard.eu>
parents: 16653
diff changeset
  1264
                    raise util.Abort(
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  1265
                        _("cannot use --exact and --keep-changes together"))
13033
026053f691a4 mq: add an '-e/--exact' option to qpush
Steve Losh <steve@stevelosh.com>
parents: 13031
diff changeset
  1266
                if move:
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16657
diff changeset
  1267
                    raise util.Abort(_('cannot use --exact and --move '
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16657
diff changeset
  1268
                                       'together'))
13033
026053f691a4 mq: add an '-e/--exact' option to qpush
Steve Losh <steve@stevelosh.com>
parents: 13031
diff changeset
  1269
                if self.applied:
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16657
diff changeset
  1270
                    raise util.Abort(_('cannot push --exact with applied '
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16657
diff changeset
  1271
                                       'patches'))
13033
026053f691a4 mq: add an '-e/--exact' option to qpush
Steve Losh <steve@stevelosh.com>
parents: 13031
diff changeset
  1272
                root = self.series[start]
026053f691a4 mq: add an '-e/--exact' option to qpush
Steve Losh <steve@stevelosh.com>
parents: 13031
diff changeset
  1273
                target = patchheader(self.join(root), self.plainmode).parent
026053f691a4 mq: add an '-e/--exact' option to qpush
Steve Losh <steve@stevelosh.com>
parents: 13031
diff changeset
  1274
                if not target:
16231
ce292f1379ba i18n: fix all remaining uses of % inside _()
Matt Mackall <mpm@selenic.com>
parents: 16188
diff changeset
  1275
                    raise util.Abort(
ce292f1379ba i18n: fix all remaining uses of % inside _()
Matt Mackall <mpm@selenic.com>
parents: 16188
diff changeset
  1276
                        _("%s does not have a parent recorded") % root)
13033
026053f691a4 mq: add an '-e/--exact' option to qpush
Steve Losh <steve@stevelosh.com>
parents: 13031
diff changeset
  1277
                if not repo[target] == repo['.']:
026053f691a4 mq: add an '-e/--exact' option to qpush
Steve Losh <steve@stevelosh.com>
parents: 13031
diff changeset
  1278
                    hg.update(repo, target)
026053f691a4 mq: add an '-e/--exact' option to qpush
Steve Losh <steve@stevelosh.com>
parents: 13031
diff changeset
  1279
11064
590b1d6ef50b mq: qpush --move, reorder patch series and apply only the patch
Mads Kiilerich <mads@kiilerich.com>
parents: 11050
diff changeset
  1280
            if move:
11715
4f9dfb54c8b5 qpush --move: move the right patch even with comment lines
Gilles Moris <gilles.moris@free.fr>
parents: 11709
diff changeset
  1281
                if not patch:
13075
d73c3034deee coding style: fix gratuitous whitespace after Python keywords
Thomas Arendsen Hein <thomas@jtah.de>
parents: 13036
diff changeset
  1282
                    raise util.Abort(_("please specify the patch to move"))
16303
7ee8aa662937 mq: fix qpush --move with comments in series file between applied patches
Mads Kiilerich <mads@kiilerich.com>
parents: 16290
diff changeset
  1283
                for fullstart, rpn in enumerate(self.fullseries):
7ee8aa662937 mq: fix qpush --move with comments in series file between applied patches
Mads Kiilerich <mads@kiilerich.com>
parents: 16290
diff changeset
  1284
                    # strip markers for patch guards
7ee8aa662937 mq: fix qpush --move with comments in series file between applied patches
Mads Kiilerich <mads@kiilerich.com>
parents: 16290
diff changeset
  1285
                    if self.guard_re.split(rpn, 1)[0] == self.series[start]:
7ee8aa662937 mq: fix qpush --move with comments in series file between applied patches
Mads Kiilerich <mads@kiilerich.com>
parents: 16290
diff changeset
  1286
                        break
7ee8aa662937 mq: fix qpush --move with comments in series file between applied patches
Mads Kiilerich <mads@kiilerich.com>
parents: 16290
diff changeset
  1287
                for i, rpn in enumerate(self.fullseries[fullstart:]):
11715
4f9dfb54c8b5 qpush --move: move the right patch even with comment lines
Gilles Moris <gilles.moris@free.fr>
parents: 11709
diff changeset
  1288
                    # strip markers for patch guards
4f9dfb54c8b5 qpush --move: move the right patch even with comment lines
Gilles Moris <gilles.moris@free.fr>
parents: 11709
diff changeset
  1289
                    if self.guard_re.split(rpn, 1)[0] == patch:
4f9dfb54c8b5 qpush --move: move the right patch even with comment lines
Gilles Moris <gilles.moris@free.fr>
parents: 11709
diff changeset
  1290
                        break
16303
7ee8aa662937 mq: fix qpush --move with comments in series file between applied patches
Mads Kiilerich <mads@kiilerich.com>
parents: 16290
diff changeset
  1291
                index = fullstart + i
14572
8ff2957c1d82 mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14564
diff changeset
  1292
                assert index < len(self.fullseries)
8ff2957c1d82 mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14564
diff changeset
  1293
                fullpatch = self.fullseries[index]
8ff2957c1d82 mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14564
diff changeset
  1294
                del self.fullseries[index]
16303
7ee8aa662937 mq: fix qpush --move with comments in series file between applied patches
Mads Kiilerich <mads@kiilerich.com>
parents: 16290
diff changeset
  1295
                self.fullseries.insert(fullstart, fullpatch)
14575
845c864200d0 mq: rename parse_series to parseseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14574
diff changeset
  1296
                self.parseseries()
15879
710e6bf15538 mq: consistently use boolean values for dirty flags
Mads Kiilerich <mads@kiilerich.com>
parents: 15878
diff changeset
  1297
                self.seriesdirty = True
710e6bf15538 mq: consistently use boolean values for dirty flags
Mads Kiilerich <mads@kiilerich.com>
parents: 15878
diff changeset
  1298
710e6bf15538 mq: consistently use boolean values for dirty flags
Mads Kiilerich <mads@kiilerich.com>
parents: 15878
diff changeset
  1299
            self.applieddirty = True
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1300
            if start > 0:
14581
da40ee1adc2b mq: rename check_toppatch to checktoppatch
Adrian Buehlmann <adrian@cadifra.com>
parents: 14580
diff changeset
  1301
                self.checktoppatch(repo)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1302
            if not patch:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1303
                patch = self.series[start]
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1304
                end = start + 1
4418
0532491f7476 MQ: tidy up if a qpush is interrupted.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4406
diff changeset
  1305
            else:
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1306
                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
  1307
16634
435375cc0ca0 mq: backup local changes in qpush --force
Patrick Mezard <patrick@mezard.eu>
parents: 16633
diff changeset
  1308
            tobackup = set()
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  1309
            if (not nobackup and force) or keepchanges:
16634
435375cc0ca0 mq: backup local changes in qpush --force
Patrick Mezard <patrick@mezard.eu>
parents: 16633
diff changeset
  1310
                m, a, r, d = self.checklocalchanges(repo, force=True)
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  1311
                if keepchanges:
16654
490ed8972f1b mq: introduce qpush --check
Patrick Mezard <patrick@mezard.eu>
parents: 16653
diff changeset
  1312
                    tobackup.update(m + a + r + d)
490ed8972f1b mq: introduce qpush --check
Patrick Mezard <patrick@mezard.eu>
parents: 16653
diff changeset
  1313
                else:
490ed8972f1b mq: introduce qpush --check
Patrick Mezard <patrick@mezard.eu>
parents: 16653
diff changeset
  1314
                    tobackup.update(m + a)
16634
435375cc0ca0 mq: backup local changes in qpush --force
Patrick Mezard <patrick@mezard.eu>
parents: 16633
diff changeset
  1315
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1316
            s = self.series[start:end]
10661
c4859aad1980 mq: all_files can be a set, remove dangerous default values
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10611
diff changeset
  1317
            all_files = set()
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1318
            try:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1319
                if mergeq:
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
  1320
                    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
  1321
                else:
16634
435375cc0ca0 mq: backup local changes in qpush --force
Patrick Mezard <patrick@mezard.eu>
parents: 16633
diff changeset
  1322
                    ret = self.apply(repo, s, list, all_files=all_files,
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  1323
                                     tobackup=tobackup, keepchanges=keepchanges)
16705
c2d9ef43ff6c check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents: 16699
diff changeset
  1324
            except: # re-raises
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1325
                self.ui.warn(_('cleaning up working directory...'))
13878
a8d13ee0ce68 misc: replace .parents()[0] with p1()
Matt Mackall <mpm@selenic.com>
parents: 13793
diff changeset
  1326
                node = repo.dirstate.p1()
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
  1327
                hg.revert(repo, node, None)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1328
                # 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
  1329
                # created while patching
10662
e8e56d8377ab mq: avoid a (potentially expensive) repo.status(unknown=True) call
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10661
diff changeset
  1330
                for f in all_files:
e8e56d8377ab mq: avoid a (potentially expensive) repo.status(unknown=True) call
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10661
diff changeset
  1331
                    if f not in repo.dirstate:
18143
242d2f4ec01c util: fold ENOENT check into unlinkpath, controlled by new ignoremissing flag
Mads Kiilerich <madski@unity3d.com>
parents: 18112
diff changeset
  1332
                        util.unlinkpath(repo.wjoin(f), ignoremissing=True)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1333
                self.ui.warn(_('done\n'))
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1334
                raise
8875
801cacf46e62 mq: fix error message for qpush inexistent-patch (issue1702)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8833
diff changeset
  1335
9590
07a62819b309 mq: fix traceback for qpush inexistant-patch with no patch applied
Benoit Allard <benoit@aeteurope.nl>
parents: 9588
diff changeset
  1336
            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
  1337
                return ret[0]
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1338
            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
  1339
            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
  1340
                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
  1341
                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
  1342
            else:
7627
fb32ae9c76e7 mq: lowercase output
Martin Geisler <mg@daimi.au.dk>
parents: 7621
diff changeset
  1343
                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
  1344
            return ret[0]
8875
801cacf46e62 mq: fix error message for qpush inexistent-patch (issue1702)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8833
diff changeset
  1345
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1346
        finally:
8112
6ee71f78497c switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8076
diff changeset
  1347
            wlock.release()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1348
16635
9d76320d8b99 mq: add --no-backup for qpush/qpop/qgoto
Patrick Mezard <patrick@mezard.eu>
parents: 16634
diff changeset
  1349
    def pop(self, repo, patch=None, force=False, update=True, all=False,
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  1350
            nobackup=False, keepchanges=False):
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  1351
        self.checkkeepchanges(keepchanges, force)
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
  1352
        wlock = repo.wlock()
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1353
        try:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1354
            if patch:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1355
                # index, rev, patch
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1356
                info = self.isapplied(patch)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1357
                if not info:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1358
                    patch = self.lookup(patch)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1359
                info = self.isapplied(patch)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1360
                if not info:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1361
                    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
  1362
10686
0c68c2c36ed8 mq: don't use len(list) unless necessary
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10685
diff changeset
  1363
            if not self.applied:
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1364
                # 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
  1365
                # 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
  1366
                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
  1367
                return not all
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1368
7620
fbfd92d51540 mq: refactor the pop code to be more readable and allow more changes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7619
diff changeset
  1369
            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
  1370
                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
  1371
            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
  1372
                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
  1373
            else:
fbfd92d51540 mq: refactor the pop code to be more readable and allow more changes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7619
diff changeset
  1374
                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
  1375
fbfd92d51540 mq: refactor the pop code to be more readable and allow more changes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7619
diff changeset
  1376
            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
  1377
                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
  1378
                return
fbfd92d51540 mq: refactor the pop code to be more readable and allow more changes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7619
diff changeset
  1379
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1380
            if not update:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1381
                parents = repo.dirstate.parents()
10678
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10663
diff changeset
  1382
                rr = [x.node 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
  1383
                for p in parents:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1384
                    if p in rr:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  1385
                        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
  1386
                        update = True
7621
6d891df43a5f mq: allow qpop if popped revisions are not working dir parents
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7620
diff changeset
  1387
            else:
10678
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10663
diff changeset
  1388
                parents = [p.node() for p in repo[None].parents()]
7621
6d891df43a5f mq: allow qpop if popped revisions are not working dir parents
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7620
diff changeset
  1389
                needupdate = False
6d891df43a5f mq: allow qpop if popped revisions are not working dir parents
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7620
diff changeset
  1390
                for entry in self.applied[start:]:
10678
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10663
diff changeset
  1391
                    if entry.node in parents:
7621
6d891df43a5f mq: allow qpop if popped revisions are not working dir parents
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7620
diff changeset
  1392
                        needupdate = True
6d891df43a5f mq: allow qpop if popped revisions are not working dir parents
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7620
diff changeset
  1393
                        break
6d891df43a5f mq: allow qpop if popped revisions are not working dir parents
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7620
diff changeset
  1394
                update = needupdate
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1395
16633
b2ca2f40c9c1 mq: backup local changes in qpop --force (issue3433)
Patrick Mezard <patrick@mezard.eu>
parents: 16551
diff changeset
  1396
            tobackup = set()
b2ca2f40c9c1 mq: backup local changes in qpop --force (issue3433)
Patrick Mezard <patrick@mezard.eu>
parents: 16551
diff changeset
  1397
            if update:
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  1398
                m, a, r, d = self.checklocalchanges(
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  1399
                    repo, force=force or keepchanges)
16653
73b8c2554be8 mq: introduce qpop --check
Patrick Mezard <patrick@mezard.eu>
parents: 16635
diff changeset
  1400
                if force:
73b8c2554be8 mq: introduce qpop --check
Patrick Mezard <patrick@mezard.eu>
parents: 16635
diff changeset
  1401
                    if not nobackup:
73b8c2554be8 mq: introduce qpop --check
Patrick Mezard <patrick@mezard.eu>
parents: 16635
diff changeset
  1402
                        tobackup.update(m + a)
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  1403
                elif keepchanges:
16653
73b8c2554be8 mq: introduce qpop --check
Patrick Mezard <patrick@mezard.eu>
parents: 16635
diff changeset
  1404
                    tobackup.update(m + a + r + d)
14732
e9ed3506f066 backout of d04ba50e104d: allow to qpop/push with a dirty working copy
Idan Kamara <idankk86@gmail.com>
parents: 14671
diff changeset
  1405
15879
710e6bf15538 mq: consistently use boolean values for dirty flags
Mads Kiilerich <mads@kiilerich.com>
parents: 15878
diff changeset
  1406
            self.applieddirty = True
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1407
            end = len(self.applied)
10678
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10663
diff changeset
  1408
            rev = self.applied[start].node
5980
dcda0c90125c mq: pop/refresh: avoid losing revisions not managed by mq
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5979
diff changeset
  1409
7621
6d891df43a5f mq: allow qpop if popped revisions are not working dir parents
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7620
diff changeset
  1410
            try:
6d891df43a5f mq: allow qpop if popped revisions are not working dir parents
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7620
diff changeset
  1411
                heads = repo.changelog.heads(rev)
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
  1412
            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
  1413
                node = short(rev)
6d891df43a5f mq: allow qpop if popped revisions are not working dir parents
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7620
diff changeset
  1414
                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
  1415
10678
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10663
diff changeset
  1416
            if heads != [self.applied[-1].node]:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  1417
                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
  1418
                                   "managed by this patch queue"))
16048
140b6282ac79 mq: prevent rewriting operation on public changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16043
diff changeset
  1419
            if not repo[self.applied[-1].node].mutable():
140b6282ac79 mq: prevent rewriting operation on public changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16043
diff changeset
  1420
                raise util.Abort(
140b6282ac79 mq: prevent rewriting operation on public changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16043
diff changeset
  1421
                    _("popping would remove an immutable revision"),
140b6282ac79 mq: prevent rewriting operation on public changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16043
diff changeset
  1422
                    hint=_('see "hg help phases" for details'))
5980
dcda0c90125c mq: pop/refresh: avoid losing revisions not managed by mq
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5979
diff changeset
  1423
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1424
            # 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
  1425
            # form of hg.update.
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1426
            if update:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1427
                qp = self.qparents(repo, rev)
10663
85e81d9bfb7a mq: simplify and use context API
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10662
diff changeset
  1428
                ctx = repo[qp]
18342
de99de39ba28 mq: fix qpop of working directory parent patch when not at qtip
Mads Kiilerich <mads@kiilerich.com>
parents: 18217
diff changeset
  1429
                m, a, r, d = repo.status(qp, '.')[:4]
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1430
                if d:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  1431
                    raise util.Abort(_("deletions found between repo revs"))
16633
b2ca2f40c9c1 mq: backup local changes in qpop --force (issue3433)
Patrick Mezard <patrick@mezard.eu>
parents: 16551
diff changeset
  1432
16653
73b8c2554be8 mq: introduce qpop --check
Patrick Mezard <patrick@mezard.eu>
parents: 16635
diff changeset
  1433
                tobackup = set(a + m + r) & tobackup
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  1434
                if keepchanges and tobackup:
19812
5d6cfdc38a3d mq: simplifies the refresh hint in checklocalchanges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19763
diff changeset
  1435
                    raise util.Abort(_("local changes found, refresh first"))
16653
73b8c2554be8 mq: introduce qpop --check
Patrick Mezard <patrick@mezard.eu>
parents: 16635
diff changeset
  1436
                self.backup(repo, tobackup)
16633
b2ca2f40c9c1 mq: backup local changes in qpop --force (issue3433)
Patrick Mezard <patrick@mezard.eu>
parents: 16551
diff changeset
  1437
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1438
                for f in a:
18143
242d2f4ec01c util: fold ENOENT check into unlinkpath, controlled by new ignoremissing flag
Mads Kiilerich <madski@unity3d.com>
parents: 18112
diff changeset
  1439
                    util.unlinkpath(repo.wjoin(f), ignoremissing=True)
14434
cc8c09855d19 dirstate: rename forget to drop
Matt Mackall <mpm@selenic.com>
parents: 14424
diff changeset
  1440
                    repo.dirstate.drop(f)
10048
46de82e50790 mq: qpop: remove added files before re-adding removed files
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9874
diff changeset
  1441
                for f in m + r:
10663
85e81d9bfb7a mq: simplify and use context API
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10662
diff changeset
  1442
                    fctx = ctx[f]
85e81d9bfb7a mq: simplify and use context API
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10662
diff changeset
  1443
                    repo.wwrite(f, fctx.data(), fctx.flags())
10048
46de82e50790 mq: qpop: remove added files before re-adding removed files
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9874
diff changeset
  1444
                    repo.dirstate.normal(f)
16551
ebf6d38c9063 localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents: 16428
diff changeset
  1445
                repo.setparents(qp, nullid)
9110
561ff8d9e4f0 mq: qpop now tells which patches are popped
Mads Kiilerich <mads@kiilerich.com>
parents: 9067
diff changeset
  1446
            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
  1447
                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
  1448
            del self.applied[start:end]
19819
f0fc4d5797e1 mq: extract `mq.queue.strip`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19818
diff changeset
  1449
            strip(self.ui, repo, [rev], update=False, backup='strip')
19638
20096384754f mq: update subrepos when applying / unapplying patches that change .hgsubstate
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19636
diff changeset
  1450
            for s, state in repo['.'].substate.items():
20096384754f mq: update subrepos when applying / unapplying patches that change .hgsubstate
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19636
diff changeset
  1451
                repo['.'].sub(s).get(state)
10686
0c68c2c36ed8 mq: don't use len(list) unless necessary
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10685
diff changeset
  1452
            if self.applied:
7627
fb32ae9c76e7 mq: lowercase output
Martin Geisler <mg@daimi.au.dk>
parents: 7621
diff changeset
  1453
                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
  1454
            else:
7627
fb32ae9c76e7 mq: lowercase output
Martin Geisler <mg@daimi.au.dk>
parents: 7621
diff changeset
  1455
                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
  1456
        finally:
8112
6ee71f78497c switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8076
diff changeset
  1457
            wlock.release()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1458
2937
9dc568f5e03d Fix test-mq-qdiff; add -I and -X options to qdiff
Brendan Cully <brendan@kublai.com>
parents: 2936
diff changeset
  1459
    def diff(self, repo, pats, opts):
14581
da40ee1adc2b mq: rename check_toppatch to checktoppatch
Adrian Buehlmann <adrian@cadifra.com>
parents: 14580
diff changeset
  1460
        top, patch = self.checktoppatch(repo)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1461
        if not top:
7627
fb32ae9c76e7 mq: lowercase output
Martin Geisler <mg@daimi.au.dk>
parents: 7621
diff changeset
  1462
            self.ui.write(_("no patches applied\n"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1463
            return
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1464
        qp = self.qparents(repo, top)
9857
24bc6e414610 diff: change --inverse to --reverse
Martin Geisler <mg@lazybytes.net>
parents: 9824
diff changeset
  1465
        if opts.get('reverse'):
9725
3f522d2fa633 diff: add --inverse option
Yannick Gingras <ygingras@ygingras.net>
parents: 9642
diff changeset
  1466
            node1, node2 = None, qp
3f522d2fa633 diff: add --inverse option
Yannick Gingras <ygingras@ygingras.net>
parents: 9642
diff changeset
  1467
        else:
3f522d2fa633 diff: add --inverse option
Yannick Gingras <ygingras@ygingras.net>
parents: 9642
diff changeset
  1468
            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
  1469
        diffopts = self.diffopts(opts, patch)
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
  1470
        self.printdiff(repo, diffopts, node1, node2, files=pats, opts=opts)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1471
2938
5b7a118f5b6c allow qrefresh to take a list of files; closes #96.
Brendan Cully <brendan@kublai.com>
parents: 2937
diff changeset
  1472
    def refresh(self, repo, pats=None, **opts):
10686
0c68c2c36ed8 mq: don't use len(list) unless necessary
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10685
diff changeset
  1473
        if not self.applied:
7627
fb32ae9c76e7 mq: lowercase output
Martin Geisler <mg@daimi.au.dk>
parents: 7621
diff changeset
  1474
            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
  1475
            return 1
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
  1476
        msg = opts.get('msg', '').rstrip()
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
  1477
        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
  1478
        newdate = opts.get('date')
989467e8e3a9 Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6120
diff changeset
  1479
        if newdate:
989467e8e3a9 Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6120
diff changeset
  1480
            newdate = '%d %d' % util.parsedate(newdate)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1481
        wlock = repo.wlock()
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1482
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1483
        try:
14581
da40ee1adc2b mq: rename check_toppatch to checktoppatch
Adrian Buehlmann <adrian@cadifra.com>
parents: 14580
diff changeset
  1484
            self.checktoppatch(repo)
10678
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10663
diff changeset
  1485
            (top, patchfn) = (self.applied[-1].node, self.applied[-1].name)
5980
dcda0c90125c mq: pop/refresh: avoid losing revisions not managed by mq
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5979
diff changeset
  1486
            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
  1487
                raise util.Abort(_("cannot refresh a revision with children"))
16048
140b6282ac79 mq: prevent rewriting operation on public changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16043
diff changeset
  1488
            if not repo[top].mutable():
140b6282ac79 mq: prevent rewriting operation on public changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16043
diff changeset
  1489
                raise util.Abort(_("cannot refresh immutable revision"),
140b6282ac79 mq: prevent rewriting operation on public changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16043
diff changeset
  1490
                                 hint=_('see "hg help phases" for details'))
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1491
17153
54da604fefee mq: check subrepo synchronizations against parent of workdir or other appropriate context
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17152
diff changeset
  1492
            cparents = repo.changelog.parents(top)
54da604fefee mq: check subrepo synchronizations against parent of workdir or other appropriate context
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17152
diff changeset
  1493
            patchparent = self.qparents(repo, top)
54da604fefee mq: check subrepo synchronizations against parent of workdir or other appropriate context
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17152
diff changeset
  1494
19813
76796fe65bad mq: extract checksubstate from the queue class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19812
diff changeset
  1495
            inclsubs = checksubstate(repo, hex(patchparent))
17152
f287d4a62031 mq: create patch file after commit to import diff of ".hgsubstate" at qrefresh
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17151
diff changeset
  1496
            if inclsubs:
f287d4a62031 mq: create patch file after commit to import diff of ".hgsubstate" at qrefresh
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17151
diff changeset
  1497
                inclsubs.append('.hgsubstate')
f287d4a62031 mq: create patch file after commit to import diff of ".hgsubstate" at qrefresh
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17151
diff changeset
  1498
                substatestate = repo.dirstate['.hgsubstate']
13174
be7e8e9bc5e5 mq: update .hgsubstate if subrepos are clean (issue2499)
Kevin Bullock <kbullock@ringworld.org>
parents: 13173
diff changeset
  1499
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
  1500
            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
  1501
            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
  1502
            if msg:
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
  1503
                ph.setmessage(msg)
5673
dd3ce7515f4d mq: add --currentuser and --user options to qnew and qrefresh
peter.arrenbrecht@gmail.com
parents: 5645
diff changeset
  1504
            if newuser:
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
  1505
                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
  1506
            if newdate:
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
  1507
                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
  1508
            ph.setparent(hex(patchparent))
5180
5bbbd1f1d586 mq: truncate patch just before rewriting header
Brendan Cully <brendan@kublai.com>
parents: 4930
diff changeset
  1509
7400
409a9b442308 mq: use atomictempfiles during patch refresh
Brendan Cully <brendan@kublai.com>
parents: 7399
diff changeset
  1510
            # only commit new patch when write is complete
409a9b442308 mq: use atomictempfiles during patch refresh
Brendan Cully <brendan@kublai.com>
parents: 7399
diff changeset
  1511
            patchf = self.opener(patchfn, 'w', atomictemp=True)
409a9b442308 mq: use atomictempfiles during patch refresh
Brendan Cully <brendan@kublai.com>
parents: 7399
diff changeset
  1512
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
  1513
            comments = str(ph)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1514
            if comments:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1515
                patchf.write(comments)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1516
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1517
            # 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
  1518
            # and then commit.
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1519
            #
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1520
            # this should really read:
13005
cffa35529706 mq: fix comment to reflect change in efbee27415ab
Martin Geisler <mg@aragost.com>
parents: 13004
diff changeset
  1521
            #   mm, dd, aa = repo.status(top, patchparent)[:3]
17425
e95ec38f86b0 fix wording and not-completely-trivial spelling errors and bad docstrings
Mads Kiilerich <mads@kiilerich.com>
parents: 17424
diff changeset
  1522
            # but we do it backwards to take advantage of manifest/changelog
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1523
            # caching against the next repo.status call
13004
efbee27415ab mq: clean up unused variable in qrefresh
Kevin Bullock <kbullock@ringworld.org>
parents: 12948
diff changeset
  1524
            mm, aa, dd = repo.status(patchparent, top)[:3]
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1525
            changes = repo.changelog.read(top)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1526
            man = repo.manifest.read(changes[0])
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1527
            aaa = aa[:]
14671
35c2cc322ba8 scmutil: switch match users to supplying contexts
Matt Mackall <mpm@selenic.com>
parents: 14636
diff changeset
  1528
            matchfn = scmutil.match(repo[None], pats, opts)
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1529
            # 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
  1530
            # patch already plus specified files
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1531
            if opts.get('short'):
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1532
                # 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
  1533
                # files plus specified files - unfiltered
14322
a90131b85fd8 scmutil: drop aliases in cmdutil for match functions
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
  1534
                match = scmutil.matchfiles(repo, mm + aa + dd + matchfn.files())
17424
e7cfe3587ea4 fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents: 17191
diff changeset
  1535
                # filter with include/exclude options
14671
35c2cc322ba8 scmutil: switch match users to supplying contexts
Matt Mackall <mpm@selenic.com>
parents: 14636
diff changeset
  1536
                matchfn = scmutil.match(repo[None], opts=opts)
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1537
            else:
14322
a90131b85fd8 scmutil: drop aliases in cmdutil for match functions
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
  1538
                match = scmutil.matchall(repo)
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1539
            m, a, r, d = repo.status(match=match)[:4]
12948
de6a28ff5ffc mq: use sets instead of lists for speed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12879
diff changeset
  1540
            mm = set(mm)
de6a28ff5ffc mq: use sets instead of lists for speed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12879
diff changeset
  1541
            aa = set(aa)
de6a28ff5ffc mq: use sets instead of lists for speed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12879
diff changeset
  1542
            dd = set(dd)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1543
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1544
            # 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
  1545
            # 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
  1546
            # 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
  1547
            # show up in the added section
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1548
            for x in m:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1549
                if x not in aa:
12948
de6a28ff5ffc mq: use sets instead of lists for speed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12879
diff changeset
  1550
                    mm.add(x)
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1551
            # 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
  1552
            # 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
  1553
            # show up in the changed section.
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1554
            for x in a:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1555
                if x in dd:
12948
de6a28ff5ffc mq: use sets instead of lists for speed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12879
diff changeset
  1556
                    dd.remove(x)
de6a28ff5ffc mq: use sets instead of lists for speed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12879
diff changeset
  1557
                    mm.add(x)
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1558
                else:
12948
de6a28ff5ffc mq: use sets instead of lists for speed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12879
diff changeset
  1559
                    aa.add(x)
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1560
            # 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
  1561
            # 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
  1562
            forget = []
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1563
            for x in d + r:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1564
                if x in aa:
12948
de6a28ff5ffc mq: use sets instead of lists for speed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12879
diff changeset
  1565
                    aa.remove(x)
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1566
                    forget.append(x)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1567
                    continue
12948
de6a28ff5ffc mq: use sets instead of lists for speed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12879
diff changeset
  1568
                else:
de6a28ff5ffc mq: use sets instead of lists for speed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12879
diff changeset
  1569
                    mm.discard(x)
de6a28ff5ffc mq: use sets instead of lists for speed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12879
diff changeset
  1570
                dd.add(x)
de6a28ff5ffc mq: use sets instead of lists for speed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12879
diff changeset
  1571
de6a28ff5ffc mq: use sets instead of lists for speed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12879
diff changeset
  1572
            m = list(mm)
de6a28ff5ffc mq: use sets instead of lists for speed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12879
diff changeset
  1573
            r = list(dd)
de6a28ff5ffc mq: use sets instead of lists for speed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12879
diff changeset
  1574
            a = list(aa)
17888
39b7052b217b mq: fix qrefresh case sensitivity (issue3271)
Durham Goode <durham@fb.com>
parents: 17887
diff changeset
  1575
18644
3e92772d5383 spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents: 18371
diff changeset
  1576
            # create 'match' that includes the files to be recommitted.
17888
39b7052b217b mq: fix qrefresh case sensitivity (issue3271)
Durham Goode <durham@fb.com>
parents: 17887
diff changeset
  1577
            # apply matchfn via repo.status to ensure correct case handling.
39b7052b217b mq: fix qrefresh case sensitivity (issue3271)
Durham Goode <durham@fb.com>
parents: 17887
diff changeset
  1578
            cm, ca, cr, cd = repo.status(patchparent, match=matchfn)[:4]
39b7052b217b mq: fix qrefresh case sensitivity (issue3271)
Durham Goode <durham@fb.com>
parents: 17887
diff changeset
  1579
            allmatches = set(cm + ca + cr + cd)
39b7052b217b mq: fix qrefresh case sensitivity (issue3271)
Durham Goode <durham@fb.com>
parents: 17887
diff changeset
  1580
            refreshchanges = [x.intersection(allmatches) for x in (mm, aa, dd)]
39b7052b217b mq: fix qrefresh case sensitivity (issue3271)
Durham Goode <durham@fb.com>
parents: 17887
diff changeset
  1581
39b7052b217b mq: fix qrefresh case sensitivity (issue3271)
Durham Goode <durham@fb.com>
parents: 17887
diff changeset
  1582
            files = set(inclsubs)
39b7052b217b mq: fix qrefresh case sensitivity (issue3271)
Durham Goode <durham@fb.com>
parents: 17887
diff changeset
  1583
            for x in refreshchanges:
39b7052b217b mq: fix qrefresh case sensitivity (issue3271)
Durham Goode <durham@fb.com>
parents: 17887
diff changeset
  1584
                files.update(x)
39b7052b217b mq: fix qrefresh case sensitivity (issue3271)
Durham Goode <durham@fb.com>
parents: 17887
diff changeset
  1585
            match = scmutil.matchfiles(repo, files)
39b7052b217b mq: fix qrefresh case sensitivity (issue3271)
Durham Goode <durham@fb.com>
parents: 17887
diff changeset
  1586
17730
6c6987761e42 mq: update bookmarks during qrefresh
David Soria Parra <dsp@php.net>
parents: 17708
diff changeset
  1587
            bmlist = repo[top].bookmarks()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1588
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1589
            try:
10368
f05e0d54f424 Merge with crew-stable
Patrick Mezard <pmezard@gmail.com>
parents: 10362 10366
diff changeset
  1590
                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
  1591
                    copies = {}
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1592
                    for dst in a:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1593
                        src = repo.dirstate.copied(dst)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1594
                        # 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
  1595
                        # 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
  1596
                        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
  1597
                            copies.setdefault(src, []).append(dst)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1598
                        repo.dirstate.add(dst)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1599
                    # 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
  1600
                    for dst in aaa:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1601
                        f = repo.file(dst)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1602
                        src = f.renamed(man[dst])
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1603
                        if src:
10368
f05e0d54f424 Merge with crew-stable
Patrick Mezard <pmezard@gmail.com>
parents: 10362 10366
diff changeset
  1604
                            copies.setdefault(src[0], []).extend(
f05e0d54f424 Merge with crew-stable
Patrick Mezard <pmezard@gmail.com>
parents: 10362 10366
diff changeset
  1605
                                copies.get(dst, []))
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1606
                            if dst in a:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1607
                                copies[src[0]].append(dst)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1608
                        # 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
  1609
                        if dst in copies:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1610
                            del copies[dst]
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1611
                    for src, dsts in copies.iteritems():
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1612
                        for dst in dsts:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1613
                            repo.dirstate.copy(src, dst)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1614
                else:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1615
                    for dst in a:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1616
                        repo.dirstate.add(dst)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1617
                    # Drop useless copy information
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1618
                    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
  1619
                        repo.dirstate.copy(None, f)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1620
                for f in r:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1621
                    repo.dirstate.remove(f)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1622
                # 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
  1623
                # 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
  1624
                mm = []
18054
b35e3364f94a check-code: there must also be whitespace between ')' and operator
Mads Kiilerich <madski@unity3d.com>
parents: 18011
diff changeset
  1625
                for i in xrange(len(m) - 1, -1, -1):
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1626
                    if not matchfn(m[i]):
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1627
                        mm.append(m[i])
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1628
                        del m[i]
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1629
                for f in m:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1630
                    repo.dirstate.normal(f)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1631
                for f in mm:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1632
                    repo.dirstate.normallookup(f)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1633
                for f in forget:
14434
cc8c09855d19 dirstate: rename forget to drop
Matt Mackall <mpm@selenic.com>
parents: 14424
diff changeset
  1634
                    repo.dirstate.drop(f)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1635
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1636
                if not msg:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1637
                    if not ph.message:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1638
                        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
  1639
                    else:
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1640
                        message = "\n".join(ph.message)
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1641
                else:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1642
                    message = msg
2694
0fb28dbf0dc7 MQ: uniformise message and logfile option.
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2682
diff changeset
  1643
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1644
                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
  1645
16026
31c02546e6de qrefresh: keep changeset phase during refresh
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16017
diff changeset
  1646
                oldphase = repo[top].phase()
31c02546e6de qrefresh: keep changeset phase during refresh
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16017
diff changeset
  1647
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1648
                # assumes strip can roll itself back if interrupted
16551
ebf6d38c9063 localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents: 16428
diff changeset
  1649
                repo.setparents(*cparents)
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1650
                self.applied.pop()
15879
710e6bf15538 mq: consistently use boolean values for dirty flags
Mads Kiilerich <mads@kiilerich.com>
parents: 15878
diff changeset
  1651
                self.applieddirty = True
19819
f0fc4d5797e1 mq: extract `mq.queue.strip`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19818
diff changeset
  1652
                strip(self.ui, repo, [top], update=False, backup='strip')
16705
c2d9ef43ff6c check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents: 16699
diff changeset
  1653
            except: # re-raises
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1654
                repo.dirstate.invalidate()
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1655
                raise
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1656
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1657
            try:
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1658
                # might be nice to attempt to roll back strip after this
16100
24df9338aa01 mq: ensure all mq commits are made with secretcommit()
Patrick Mezard <patrick@mezard.eu>
parents: 16064
diff changeset
  1659
24df9338aa01 mq: ensure all mq commits are made with secretcommit()
Patrick Mezard <patrick@mezard.eu>
parents: 16064
diff changeset
  1660
                # Ensure we create a new changeset in the same phase than
24df9338aa01 mq: ensure all mq commits are made with secretcommit()
Patrick Mezard <patrick@mezard.eu>
parents: 16064
diff changeset
  1661
                # the old one.
16102
50682c07a8d0 merge with stable
Matt Mackall <mpm@selenic.com>
parents: 16065 16101
diff changeset
  1662
                n = newcommit(repo, oldphase, message, user, ph.date,
50682c07a8d0 merge with stable
Matt Mackall <mpm@selenic.com>
parents: 16065 16101
diff changeset
  1663
                              match=match, force=True)
13632
33a33f19aad2 mq: do not let qrefresh write bad patch
Martin Geisler <mg@lazybytes.net>
parents: 13520
diff changeset
  1664
                # only write patch after a successful commit
17888
39b7052b217b mq: fix qrefresh case sensitivity (issue3271)
Durham Goode <durham@fb.com>
parents: 17887
diff changeset
  1665
                c = [list(x) for x in refreshchanges]
17152
f287d4a62031 mq: create patch file after commit to import diff of ".hgsubstate" at qrefresh
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17151
diff changeset
  1666
                if inclsubs:
f287d4a62031 mq: create patch file after commit to import diff of ".hgsubstate" at qrefresh
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17151
diff changeset
  1667
                    self.putsubstate2changes(substatestate, c)
f287d4a62031 mq: create patch file after commit to import diff of ".hgsubstate" at qrefresh
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17151
diff changeset
  1668
                chunks = patchmod.diff(repo, patchparent,
f287d4a62031 mq: create patch file after commit to import diff of ".hgsubstate" at qrefresh
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17151
diff changeset
  1669
                                       changes=c, opts=diffopts)
f287d4a62031 mq: create patch file after commit to import diff of ".hgsubstate" at qrefresh
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17151
diff changeset
  1670
                for chunk in chunks:
f287d4a62031 mq: create patch file after commit to import diff of ".hgsubstate" at qrefresh
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17151
diff changeset
  1671
                    patchf.write(chunk)
15057
774da7121fc9 atomictempfile: make close() consistent with other file-like objects.
Greg Ward <greg@gerg.ca>
parents: 14987
diff changeset
  1672
                patchf.close()
17730
6c6987761e42 mq: update bookmarks during qrefresh
David Soria Parra <dsp@php.net>
parents: 17708
diff changeset
  1673
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17893
diff changeset
  1674
                marks = repo._bookmarks
17730
6c6987761e42 mq: update bookmarks during qrefresh
David Soria Parra <dsp@php.net>
parents: 17708
diff changeset
  1675
                for bm in bmlist:
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17893
diff changeset
  1676
                    marks[bm] = n
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17893
diff changeset
  1677
                marks.write()
17730
6c6987761e42 mq: update bookmarks during qrefresh
David Soria Parra <dsp@php.net>
parents: 17708
diff changeset
  1678
10678
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10663
diff changeset
  1679
                self.applied.append(statusentry(n, patchfn))
16705
c2d9ef43ff6c check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents: 16699
diff changeset
  1680
            except: # re-raises
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1681
                ctx = repo[cparents[0]]
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1682
                repo.dirstate.rebuild(ctx.node(), ctx.manifest())
14580
92101ea35015 mq: rename save_dirty to savedirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14579
diff changeset
  1683
                self.savedirty()
10366
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1684
                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
  1685
                               '(revert --all, qpush to recover)\n'))
d355cebde5e6 mq: remove qrefresh slow path (issue2025)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10274
diff changeset
  1686
                raise
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  1687
        finally:
8112
6ee71f78497c switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8076
diff changeset
  1688
            wlock.release()
7401
41e87b4d0c9d mq: recover more gracefully from interrupted qrefresh (issue1216)
Brendan Cully <brendan@kublai.com>
parents: 7400
diff changeset
  1689
            self.removeundo(repo)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1690
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1691
    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
  1692
        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
  1693
            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
  1694
        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
  1695
            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
  1696
        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
  1697
            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
  1698
                raise
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1699
        if create:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1700
            return self.qrepo(create=True)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1701
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1702
    def unapplied(self, repo, patch=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1703
        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
  1704
            raise util.Abort(_("patch %s is not in series file") % patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1705
        if not patch:
14586
af91cb281975 mq: rename series_end to seriesend
Adrian Buehlmann <adrian@cadifra.com>
parents: 14585
diff changeset
  1706
            start = self.seriesend()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1707
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1708
            start = self.series.index(patch) + 1
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1709
        unapplied = []
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1710
        for i in xrange(start, len(self.series)):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1711
            pushable, reason = self.pushable(i)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1712
            if pushable:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1713
                unapplied.append((i, self.series[i]))
14579
f7b25764d974 mq: rename explain_pushable to explainpushable
Adrian Buehlmann <adrian@cadifra.com>
parents: 14578
diff changeset
  1714
            self.explainpushable(i)
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1715
        return unapplied
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1716
4239
417c2068cb92 Simplified qseries and hg qapplied to fix some bugs caused by optimization:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4238
diff changeset
  1717
    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
  1718
                summary=False):
10824
18def0d5692d qseries: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10823
diff changeset
  1719
        def displayname(pfx, patchname, state):
10932
29c39fe2491b mq: only highlight/label patch name for qseries.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10890
diff changeset
  1720
            if pfx:
29c39fe2491b mq: only highlight/label patch name for qseries.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10890
diff changeset
  1721
                self.ui.write(pfx)
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1722
            if summary:
10397
8cb81d75730c mq: add parent node IDs to MQ patches on qrefresh/qnew
Steve Losh <steve@stevelosh.com>
parents: 10382
diff changeset
  1723
                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
  1724
                msg = ph.message and ph.message[0] or ''
11327
6c469f2f9f12 mq: use ui.formatted() instead of ui.plain().
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11321
diff changeset
  1725
                if self.ui.formatted():
12689
c52c629ce19e termwidth: move to ui.ui from util
Augie Fackler <durin42@gmail.com>
parents: 12682
diff changeset
  1726
                    width = self.ui.termwidth() - len(pfx) - len(patchname) - 2
9874
c51494c53841 qseries: don't truncate the patch name (issue1912)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9867
diff changeset
  1727
                    if width > 0:
c51494c53841 qseries: don't truncate the patch name (issue1912)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9867
diff changeset
  1728
                        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
  1729
                    else:
c51494c53841 qseries: don't truncate the patch name (issue1912)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9867
diff changeset
  1730
                        msg = ''
10932
29c39fe2491b mq: only highlight/label patch name for qseries.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10890
diff changeset
  1731
                self.ui.write(patchname, label='qseries.' + state)
29c39fe2491b mq: only highlight/label patch name for qseries.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10890
diff changeset
  1732
                self.ui.write(': ')
29c39fe2491b mq: only highlight/label patch name for qseries.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10890
diff changeset
  1733
                self.ui.write(msg, label='qseries.message.' + state)
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1734
            else:
10932
29c39fe2491b mq: only highlight/label patch name for qseries.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10890
diff changeset
  1735
                self.ui.write(patchname, label='qseries.' + state)
29c39fe2491b mq: only highlight/label patch name for qseries.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10890
diff changeset
  1736
            self.ui.write('\n')
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1737
8152
08e1baf924ca replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents: 8151
diff changeset
  1738
        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
  1739
        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
  1740
            length = len(self.series) - start
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1741
        if not missing:
9016
894c5b4be275 mq: align columns in verbose qseries output.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 8948
diff changeset
  1742
            if self.ui.verbose:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  1743
                idxwidth = len(str(start + length - 1))
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  1744
            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
  1745
                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
  1746
                if patch in applied:
10824
18def0d5692d qseries: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10823
diff changeset
  1747
                    char, state = 'A', '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
  1748
                elif self.pushable(i)[0]:
10824
18def0d5692d qseries: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10823
diff changeset
  1749
                    char, state = 'U', 'unapplied'
4239
417c2068cb92 Simplified qseries and hg qapplied to fix some bugs caused by optimization:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4238
diff changeset
  1750
                else:
10824
18def0d5692d qseries: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10823
diff changeset
  1751
                    char, state = 'G', 'guarded'
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  1752
                pfx = ''
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1753
                if self.ui.verbose:
10824
18def0d5692d qseries: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10823
diff changeset
  1754
                    pfx = '%*d %s ' % (idxwidth, i, char)
18def0d5692d qseries: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10823
diff changeset
  1755
                elif status and status != char:
4238
ce6c364ebb2a Fix issue443: inconsistent output of "hg qunapplied -v"
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4173
diff changeset
  1756
                    continue
10824
18def0d5692d qseries: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10823
diff changeset
  1757
                displayname(pfx, patch, state)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1758
        else:
2794
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
  1759
            msng_list = []
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1760
            for root, dirs, files in os.walk(self.path):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1761
                d = root[len(self.path) + 1:]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1762
                for f in files:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1763
                    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
  1764
                    if (fl not in self.series and
14588
bd3d75a03f80 mq: rename status_path to statuspath
Adrian Buehlmann <adrian@cadifra.com>
parents: 14587
diff changeset
  1765
                        fl not in (self.statuspath, self.seriespath,
14589
7d59ee9e711b mq: rename guards_path to guardspath
Adrian Buehlmann <adrian@cadifra.com>
parents: 14588
diff changeset
  1766
                                   self.guardspath)
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
  1767
                        and not fl.startswith('.')):
2794
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
  1768
                        msng_list.append(fl)
8209
a1a5a57efe90 replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents: 8188
diff changeset
  1769
            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
  1770
                pfx = self.ui.verbose and ('D ') or ''
10824
18def0d5692d qseries: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10823
diff changeset
  1771
                displayname(pfx, x, 'missing')
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1772
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1773
    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
  1774
        if l.name == '.hg.patches.save.line':
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1775
            return True
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1776
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1777
    def qrepo(self, create=False):
19064
743daa601445 mq: do not inherit settings form base repo in mqrepo (Fixes issue2358)
Simon Heimberg <simohe@besonet.ch>
parents: 18958
diff changeset
  1778
        ui = self.baseui.copy()
2819
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
  1779
        if create or os.path.isdir(self.join(".hg")):
11965
77f1f206e135 mq: don't inherit default and default-push paths with --mq (issue2333)
Mads Kiilerich <mads@kiilerich.com>
parents: 11715
diff changeset
  1780
            return hg.repository(ui, path=self.path, create=create)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1781
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1782
    def restore(self, repo, rev, delete=None, qupdate=None):
10681
3f6a6407a3c7 mq: use context API
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10680
diff changeset
  1783
        desc = repo[rev].description().strip()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1784
        lines = desc.splitlines()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1785
        i = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1786
        datastart = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1787
        series = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1788
        applied = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1789
        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
  1790
        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
  1791
            if line == 'Patch Data:':
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1792
                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
  1793
            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
  1794
                l = line.rstrip()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1795
                l = l[10:].split(' ')
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  1796
                qpp = [bin(x) for x in l]
13031
3da456d0c885 code style: prefer 'is' and 'is not' tests with singletons
Martin Geisler <mg@aragost.com>
parents: 13005
diff changeset
  1797
            elif datastart is not None:
8632
9e055cfdd620 replace "i in range(len(xs))" with "i, x in enumerate(xs)"
Martin Geisler <mg@lazybytes.net>
parents: 8624
diff changeset
  1798
                l = line.rstrip()
10683
cfbf064f0069 mq: qsave creates entries with the left part empty (':patchname')
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10682
diff changeset
  1799
                n, name = l.split(':', 1)
cfbf064f0069 mq: qsave creates entries with the left part empty (':patchname')
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10682
diff changeset
  1800
                if n:
cfbf064f0069 mq: qsave creates entries with the left part empty (':patchname')
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10682
diff changeset
  1801
                    applied.append(statusentry(bin(n), name))
3185
b3e103c388fc mq: don't write applied patches into series twice in restore
Brendan Cully <brendan@kublai.com>
parents: 3184
diff changeset
  1802
                else:
10682
8ed350051896 mq: simplify statusentry(), fix restore broken by ee48e5ef8753
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10681
diff changeset
  1803
                    series.append(l)
8527
f9a80054dd3c use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents: 8525
diff changeset
  1804
        if datastart is None:
16929
4b02d7006169 mq: lowercase warning messages
Martin Geisler <mg@aragost.com>
parents: 16867
diff changeset
  1805
            self.ui.warn(_("no saved patch data found\n"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1806
            return 1
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  1807
        self.ui.warn(_("restoring status: %s\n") % lines[0])
14572
8ff2957c1d82 mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14564
diff changeset
  1808
        self.fullseries = series
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1809
        self.applied = applied
14575
845c864200d0 mq: rename parse_series to parseseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14574
diff changeset
  1810
        self.parseseries()
15879
710e6bf15538 mq: consistently use boolean values for dirty flags
Mads Kiilerich <mads@kiilerich.com>
parents: 15878
diff changeset
  1811
        self.seriesdirty = True
710e6bf15538 mq: consistently use boolean values for dirty flags
Mads Kiilerich <mads@kiilerich.com>
parents: 15878
diff changeset
  1812
        self.applieddirty = True
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1813
        heads = repo.changelog.heads()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1814
        if delete:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1815
            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
  1816
                self.ui.warn(_("save entry has children, leaving it alone\n"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1817
            else:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  1818
                self.ui.warn(_("removing save entry %s\n") % short(rev))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1819
                pp = repo.dirstate.parents()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1820
                if rev in pp:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1821
                    update = True
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1822
                else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1823
                    update = False
19819
f0fc4d5797e1 mq: extract `mq.queue.strip`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19818
diff changeset
  1824
                strip(self.ui, repo, [rev], update=update, backup='strip')
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1825
        if qpp:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  1826
            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
  1827
                         (short(qpp[0]), short(qpp[1])))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1828
            if qupdate:
12848
f7f1a146f407 qrestore: trying to improve the English
timeless <timeless@gmail.com>
parents: 12775
diff changeset
  1829
                self.ui.status(_("updating queue directory\n"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1830
                r = self.qrepo()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1831
                if not r:
16929
4b02d7006169 mq: lowercase warning messages
Martin Geisler <mg@aragost.com>
parents: 16867
diff changeset
  1832
                    self.ui.warn(_("unable to load queue repository\n"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1833
                    return 1
2808
30f59f4a327e Introduce update helper functions: update, merge, clean, and revert
Matt Mackall <mpm@selenic.com>
parents: 2804
diff changeset
  1834
                hg.clean(r, qpp[0])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1835
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1836
    def save(self, repo, msg=None):
10686
0c68c2c36ed8 mq: don't use len(list) unless necessary
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10685
diff changeset
  1837
        if not self.applied:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  1838
            self.ui.warn(_("save: no patches applied, exiting\n"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1839
            return 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1840
        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
  1841
            self.ui.warn(_("status is already saved\n"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1842
            return 1
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1843
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1844
        if not msg:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  1845
            msg = _("hg patches saved state")
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1846
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1847
            msg = "hg patches: " + msg.rstrip('\r\n')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1848
        r = self.qrepo()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1849
        if r:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1850
            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
  1851
            msg += "\nDirstate: %s %s" % (hex(pp[0]), hex(pp[1]))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1852
        msg += "\n\nPatch Data:\n"
10679
35abaea778dc mq: simplify commit message generation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10678
diff changeset
  1853
        msg += ''.join('%s\n' % x for x in self.applied)
14572
8ff2957c1d82 mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14564
diff changeset
  1854
        msg += ''.join(':%s\n' % x for x in self.fullseries)
10679
35abaea778dc mq: simplify commit message generation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10678
diff changeset
  1855
        n = repo.commit(msg, force=True)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1856
        if not n:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  1857
            self.ui.warn(_("repo commit failed\n"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1858
            return 1
10684
485c1d7f8a77 mq: fix coding style (missing space)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10683
diff changeset
  1859
        self.applied.append(statusentry(n, '.hg.patches.save.line'))
15879
710e6bf15538 mq: consistently use boolean values for dirty flags
Mads Kiilerich <mads@kiilerich.com>
parents: 15878
diff changeset
  1860
        self.applieddirty = True
4209
dbc3846c09a1 Merge with -stable, fix small test failure
Matt Mackall <mpm@selenic.com>
parents: 4207
diff changeset
  1861
        self.removeundo(repo)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1862
14585
74bf9c84cfd0 mq: rename full_series_end to fullseriesend
Adrian Buehlmann <adrian@cadifra.com>
parents: 14584
diff changeset
  1863
    def fullseriesend(self):
10686
0c68c2c36ed8 mq: don't use len(list) unless necessary
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10685
diff changeset
  1864
        if self.applied:
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
  1865
            p = self.applied[-1].name
14574
12fba7bcb4f1 mq: rename find_series to findseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14573
diff changeset
  1866
            end = self.findseries(p)
8527
f9a80054dd3c use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents: 8525
diff changeset
  1867
            if end is None:
14572
8ff2957c1d82 mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14564
diff changeset
  1868
                return len(self.fullseries)
2698
c1123e83c8e2 mq: fix qnew and qimport to deal with series file comments
Chris Mason <mason@suse.com>
parents: 2697
diff changeset
  1869
            return end + 1
c1123e83c8e2 mq: fix qnew and qimport to deal with series file comments
Chris Mason <mason@suse.com>
parents: 2697
diff changeset
  1870
        return 0
c1123e83c8e2 mq: fix qnew and qimport to deal with series file comments
Chris Mason <mason@suse.com>
parents: 2697
diff changeset
  1871
14586
af91cb281975 mq: rename series_end to seriesend
Adrian Buehlmann <adrian@cadifra.com>
parents: 14585
diff changeset
  1872
    def seriesend(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
  1873
        """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
  1874
        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
  1875
        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
  1876
        """
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1877
        end = 0
19500
a96565abbd59 mq: rename next() to nextpatch() to avoid confusing a future check-code patch
Augie Fackler <raf@durin42.com>
parents: 19481
diff changeset
  1878
        def nextpatch(start):
10687
583adcf63f80 mq: use xrange/enumerate instead of += 1
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10686
diff changeset
  1879
            if all_patches or start >= len(self.series):
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1880
                return start
10687
583adcf63f80 mq: use xrange/enumerate instead of += 1
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10686
diff changeset
  1881
            for i in xrange(start, len(self.series)):
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1882
                p, reason = self.pushable(i)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  1883
                if p:
16063
c36db39b3fee mq: fix qnext when all remaining patches are guarded
Patrick Mezard <pmezard@gmail.com>
parents: 16048
diff changeset
  1884
                    return i
14579
f7b25764d974 mq: rename explain_pushable to explainpushable
Adrian Buehlmann <adrian@cadifra.com>
parents: 14578
diff changeset
  1885
                self.explainpushable(i)
16063
c36db39b3fee mq: fix qnext when all remaining patches are guarded
Patrick Mezard <pmezard@gmail.com>
parents: 16048
diff changeset
  1886
            return len(self.series)
10686
0c68c2c36ed8 mq: don't use len(list) unless necessary
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10685
diff changeset
  1887
        if self.applied:
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
  1888
            p = self.applied[-1].name
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1889
            try:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1890
                end = self.series.index(p)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1891
            except ValueError:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1892
                return 0
19500
a96565abbd59 mq: rename next() to nextpatch() to avoid confusing a future check-code patch
Augie Fackler <raf@durin42.com>
parents: 19481
diff changeset
  1893
            return nextpatch(end + 1)
a96565abbd59 mq: rename next() to nextpatch() to avoid confusing a future check-code patch
Augie Fackler <raf@durin42.com>
parents: 19481
diff changeset
  1894
        return nextpatch(end)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1895
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1896
    def appliedname(self, index):
2780
ee48e5ef8753 Use StatusEntry class instead of repeated status line parsing.
Brendan Cully <brendan@kublai.com>
parents: 2765
diff changeset
  1897
        pname = self.applied[index].name
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1898
        if not self.ui.verbose:
2677
ec05ce9cbf47 mq: uniform verbose display of patche[s].
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2664
diff changeset
  1899
            p = pname
ec05ce9cbf47 mq: uniform verbose display of patche[s].
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2664
diff changeset
  1900
        else:
2941
d32df6452323 mq: fix appliedname
Brendan Cully <brendan@kublai.com>
parents: 2940
diff changeset
  1901
            p = str(self.series.index(pname)) + " " + pname
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1902
        return p
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  1903
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1904
    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
  1905
                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
  1906
        def checkseries(patchname):
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1907
            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
  1908
                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
  1909
                                 % patchname)
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1910
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1911
        if rev:
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1912
            if files:
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1913
                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
  1914
                                   'files'))
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14298
diff changeset
  1915
            rev = scmutil.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
  1916
            rev.sort(reverse=True)
16987
54295c87eefc mq: abort if no files or revisions are specified for qimport
Thomas Arendsen Hein <thomas@intevation.de>
parents: 16929
diff changeset
  1917
        elif not files:
54295c87eefc mq: abort if no files or revisions are specified for qimport
Thomas Arendsen Hein <thomas@intevation.de>
parents: 16929
diff changeset
  1918
            raise util.Abort(_('no files or revisions specified'))
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1919
        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
  1920
            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
  1921
                               'patches'))
16119
5de83d9ca79c mq: make qimport --push push all imported patches (issue3130)
Patrick Mezard <patrick@mezard.eu>
parents: 16101
diff changeset
  1922
        imported = []
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1923
        if rev:
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1924
            # 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
  1925
            # 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
  1926
            # 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
  1927
            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
  1928
            if len(heads) > 1:
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1929
                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
  1930
                                   'branch') % rev[-1])
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1931
            if self.applied:
10678
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10663
diff changeset
  1932
                base = repo.changelog.node(rev[0])
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10663
diff changeset
  1933
                if base in [n.node for n in self.applied]:
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1934
                    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
  1935
                                     % rev[0])
10678
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10663
diff changeset
  1936
                if heads != [self.applied[-1].node]:
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1937
                    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
  1938
                                       'the queue') % rev[0])
10678
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10663
diff changeset
  1939
                base = repo.changelog.rev(self.applied[0].node)
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1940
                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
  1941
            else:
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1942
                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
  1943
                    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
  1944
                                     % rev[0])
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1945
                lastparent = None
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1946
10184
8a47347d298b mq: stop caching and sharing diff options
Patrick Mezard <pmezard@gmail.com>
parents: 10114
diff changeset
  1947
            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
  1948
            for r in rev:
15704
8857e150bec0 phases: prevent mq to qimport immutable change.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15476
diff changeset
  1949
                if not repo[r].mutable():
8857e150bec0 phases: prevent mq to qimport immutable change.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15476
diff changeset
  1950
                    raise util.Abort(_('revision %d is not mutable') % r,
8857e150bec0 phases: prevent mq to qimport immutable change.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15476
diff changeset
  1951
                                     hint=_('see "hg help phases" for details'))
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1952
                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
  1953
                n = repo.changelog.node(r)
7639
ae7a614a6a57 mq: remove import of revlog
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
  1954
                if p2 != nullrev:
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1955
                    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
  1956
                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
  1957
                    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
  1958
                                     % (r, lastparent))
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1959
                lastparent = p1
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1960
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1961
                if not patchname:
4037
bbdba01cce28 Enforce unixish style for all generated patch names.
Patrick Mezard <pmezard@gmail.com>
parents: 4016
diff changeset
  1962
                    patchname = normname('%d.diff' % r)
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1963
                checkseries(patchname)
14423
7230aef66b7c mq: use checkpatchname
Idan Kamara <idankk86@gmail.com>
parents: 14422
diff changeset
  1964
                self.checkpatchname(patchname, force)
14572
8ff2957c1d82 mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14564
diff changeset
  1965
                self.fullseries.insert(0, patchname)
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1966
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1967
                patchf = self.opener(patchname, "w")
10611
e764f24a45ee patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10591
diff changeset
  1968
                cmdutil.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
  1969
                patchf.close()
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1970
10678
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10663
diff changeset
  1971
                se = statusentry(n, patchname)
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1972
                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
  1973
11462
1b82a26635d7 mq: qimport cleanup on fail (issue2214)
Vishakh H <vsh426@gmail.com>
parents: 11439
diff changeset
  1974
                self.added.append(patchname)
16119
5de83d9ca79c mq: make qimport --push push all imported patches (issue3130)
Patrick Mezard <patrick@mezard.eu>
parents: 16101
diff changeset
  1975
                imported.append(patchname)
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1976
                patchname = None
16027
29ea059be33c qimport: when mq.secret=True set qimported revision as secret
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16026
diff changeset
  1977
            if rev and repo.ui.configbool('mq', 'secret', False):
29ea059be33c qimport: when mq.secret=True set qimported revision as secret
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16026
diff changeset
  1978
                # if we added anything with --rev, we must move the secret root
29ea059be33c qimport: when mq.secret=True set qimported revision as secret
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16026
diff changeset
  1979
                phases.retractboundary(repo, phases.secret, [n])
14575
845c864200d0 mq: rename parse_series to parseseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14574
diff changeset
  1980
            self.parseseries()
15879
710e6bf15538 mq: consistently use boolean values for dirty flags
Mads Kiilerich <mads@kiilerich.com>
parents: 15878
diff changeset
  1981
            self.applieddirty = True
14593
599a72895c0d mq: rename series_dirty to seriesdirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14592
diff changeset
  1982
            self.seriesdirty = True
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  1983
10687
583adcf63f80 mq: use xrange/enumerate instead of += 1
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10686
diff changeset
  1984
        for i, filename in enumerate(files):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  1985
            if existing:
3547
891c8d20f80f mq: support qimport -
Brendan Cully <brendan@kublai.com>
parents: 3492
diff changeset
  1986
                if filename == '-':
891c8d20f80f mq: support qimport -
Brendan Cully <brendan@kublai.com>
parents: 3492
diff changeset
  1987
                    raise util.Abort(_('-e is incompatible with import from -'))
11699
da0b9109186d mq: support "qimport --existing --name renametothis thatexistingpatch"
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11644
diff changeset
  1988
                filename = normname(filename)
14584
3343a74eea4e mq: rename check_reserved_name to checkreservedname
Adrian Buehlmann <adrian@cadifra.com>
parents: 14583
diff changeset
  1989
                self.checkreservedname(filename)
11699
da0b9109186d mq: support "qimport --existing --name renametothis thatexistingpatch"
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11644
diff changeset
  1990
                originpath = self.join(filename)
da0b9109186d mq: support "qimport --existing --name renametothis thatexistingpatch"
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11644
diff changeset
  1991
                if not os.path.isfile(originpath):
da0b9109186d mq: support "qimport --existing --name renametothis thatexistingpatch"
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11644
diff changeset
  1992
                    raise util.Abort(_("patch %s does not exist") % filename)
da0b9109186d mq: support "qimport --existing --name renametothis thatexistingpatch"
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11644
diff changeset
  1993
da0b9109186d mq: support "qimport --existing --name renametothis thatexistingpatch"
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11644
diff changeset
  1994
                if patchname:
14423
7230aef66b7c mq: use checkpatchname
Idan Kamara <idankk86@gmail.com>
parents: 14422
diff changeset
  1995
                    self.checkpatchname(patchname, force)
11699
da0b9109186d mq: support "qimport --existing --name renametothis thatexistingpatch"
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11644
diff changeset
  1996
da0b9109186d mq: support "qimport --existing --name renametothis thatexistingpatch"
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11644
diff changeset
  1997
                    self.ui.write(_('renaming %s to %s\n')
da0b9109186d mq: support "qimport --existing --name renametothis thatexistingpatch"
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11644
diff changeset
  1998
                                        % (filename, patchname))
11701
84fb29f5e0d2 mq: fix qimport --name --existing --force on win32
Patrick Mezard <pmezard@gmail.com>
parents: 11700
diff changeset
  1999
                    util.rename(originpath, self.join(patchname))
11699
da0b9109186d mq: support "qimport --existing --name renametothis thatexistingpatch"
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11644
diff changeset
  2000
                else:
da0b9109186d mq: support "qimport --existing --name renametothis thatexistingpatch"
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11644
diff changeset
  2001
                    patchname = filename
da0b9109186d mq: support "qimport --existing --name renametothis thatexistingpatch"
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11644
diff changeset
  2002
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2003
            else:
14395
dc961471efde mq: check patch name is valid before reading imported file
Idan Kamara <idankk86@gmail.com>
parents: 14382
diff changeset
  2004
                if filename == '-' and not patchname:
dc961471efde mq: check patch name is valid before reading imported file
Idan Kamara <idankk86@gmail.com>
parents: 14382
diff changeset
  2005
                    raise util.Abort(_('need --name to import a patch from -'))
dc961471efde mq: check patch name is valid before reading imported file
Idan Kamara <idankk86@gmail.com>
parents: 14382
diff changeset
  2006
                elif not patchname:
14396
170747a3e139 mq: strip all leading slashes from url when importing
Idan Kamara <idankk86@gmail.com>
parents: 14395
diff changeset
  2007
                    patchname = normname(os.path.basename(filename.rstrip('/')))
14423
7230aef66b7c mq: use checkpatchname
Idan Kamara <idankk86@gmail.com>
parents: 14422
diff changeset
  2008
                self.checkpatchname(patchname, force)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2009
                try:
3547
891c8d20f80f mq: support qimport -
Brendan Cully <brendan@kublai.com>
parents: 3492
diff changeset
  2010
                    if filename == '-':
14636
b98063487a6f mq: use ui.fin when importing patch from '-'
Idan Kamara <idankk86@gmail.com>
parents: 14635
diff changeset
  2011
                        text = self.ui.fin.read()
3547
891c8d20f80f mq: support qimport -
Brendan Cully <brendan@kublai.com>
parents: 3492
diff changeset
  2012
                    else:
17887
0e2846b2482c url: use open and not url.open for local files (issue3624)
Siddharth Agarwal <sid0@fb.com>
parents: 17773
diff changeset
  2013
                        fp = hg.openpath(self.ui, filename)
13400
14f3795a5ed7 explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13373
diff changeset
  2014
                        text = fp.read()
14f3795a5ed7 explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13373
diff changeset
  2015
                        fp.close()
7421
4c4324476be6 Catch both IOError and OSError, fix regression introduced by 8046f0a070a6
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7414
diff changeset
  2016
                except (OSError, IOError):
11709
3e561b6af810 mq: clarify the fact that qimport is trying to read a file
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11637
diff changeset
  2017
                    raise util.Abort(_("unable to read file %s") % filename)
3133
15fde1970003 qimport: rename patch to patchname to avoid shadowing module
Brendan Cully <brendan@kublai.com>
parents: 3091
diff changeset
  2018
                patchf = self.opener(patchname, "w")
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2019
                patchf.write(text)
13400
14f3795a5ed7 explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13373
diff changeset
  2020
                patchf.close()
7160
1b7b21b634f2 mq: make qimport -f work properly. Closes issue1255.
Brendan Cully <brendan@kublai.com>
parents: 7158
diff changeset
  2021
            if not force:
1b7b21b634f2 mq: make qimport -f work properly. Closes issue1255.
Brendan Cully <brendan@kublai.com>
parents: 7158
diff changeset
  2022
                checkseries(patchname)
1b7b21b634f2 mq: make qimport -f work properly. Closes issue1255.
Brendan Cully <brendan@kublai.com>
parents: 7158
diff changeset
  2023
            if patchname not in self.series:
14585
74bf9c84cfd0 mq: rename full_series_end to fullseriesend
Adrian Buehlmann <adrian@cadifra.com>
parents: 14584
diff changeset
  2024
                index = self.fullseriesend() + i
14572
8ff2957c1d82 mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14564
diff changeset
  2025
                self.fullseries[index:index] = [patchname]
14575
845c864200d0 mq: rename parse_series to parseseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14574
diff changeset
  2026
            self.parseseries()
14593
599a72895c0d mq: rename series_dirty to seriesdirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14592
diff changeset
  2027
            self.seriesdirty = True
7597
81f68565281c mq, i18n: mark strings for translation
Martin Geisler <mg@daimi.au.dk>
parents: 7454
diff changeset
  2028
            self.ui.warn(_("adding %s to series file\n") % patchname)
11462
1b82a26635d7 mq: qimport cleanup on fail (issue2214)
Vishakh H <vsh426@gmail.com>
parents: 11439
diff changeset
  2029
            self.added.append(patchname)
16119
5de83d9ca79c mq: make qimport --push push all imported patches (issue3130)
Patrick Mezard <patrick@mezard.eu>
parents: 16101
diff changeset
  2030
            imported.append(patchname)
3133
15fde1970003 qimport: rename patch to patchname to avoid shadowing module
Brendan Cully <brendan@kublai.com>
parents: 3091
diff changeset
  2031
            patchname = None
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2032
13409
9e5df8719ad4 mq: remove undo after a qimport
André Sintzoff <andre.sintzoff@gmail.com>
parents: 13400
diff changeset
  2033
        self.removeundo(repo)
16119
5de83d9ca79c mq: make qimport --push push all imported patches (issue3130)
Patrick Mezard <patrick@mezard.eu>
parents: 16101
diff changeset
  2034
        return imported
13409
9e5df8719ad4 mq: remove undo after a qimport
André Sintzoff <andre.sintzoff@gmail.com>
parents: 13400
diff changeset
  2035
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  2036
def fixkeepchangesopts(ui, opts):
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  2037
    if (not ui.configbool('mq', 'keepchanges') or opts.get('force')
16656
4ae3ba9e4d7a mq: introduce mq.check setting
Patrick Mezard <patrick@mezard.eu>
parents: 16655
diff changeset
  2038
        or opts.get('exact')):
4ae3ba9e4d7a mq: introduce mq.check setting
Patrick Mezard <patrick@mezard.eu>
parents: 16655
diff changeset
  2039
        return opts
4ae3ba9e4d7a mq: introduce mq.check setting
Patrick Mezard <patrick@mezard.eu>
parents: 16655
diff changeset
  2040
    opts = dict(opts)
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  2041
    opts['keep_changes'] = True
16656
4ae3ba9e4d7a mq: introduce mq.check setting
Patrick Mezard <patrick@mezard.eu>
parents: 16655
diff changeset
  2042
    return opts
4ae3ba9e4d7a mq: introduce mq.check setting
Patrick Mezard <patrick@mezard.eu>
parents: 16655
diff changeset
  2043
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2044
@command("qdelete|qremove|qrm",
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2045
         [('k', 'keep', None, _('keep patch file')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2046
          ('r', 'rev', [],
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2047
           _('stop managing a revision (DEPRECATED)'), _('REV'))],
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2048
         _('hg qdelete [-k] [PATCH]...'))
3373
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
  2049
def delete(ui, repo, *patches, **opts):
2905
790fd342b6c7 Allow qdel to delete multiple patches.
Brendan Cully <brendan@kublai.com>
parents: 2904
diff changeset
  2050
    """remove patches from queue
2752
5dfeda163bb7 Add -f option to qdelete, to remove patch file.
Brendan Cully <brendan@kublai.com>
parents: 2751
diff changeset
  2051
15798
e6c44dbe902f mq: Document that qdel requires exact patch identifiers
Olav Reinert <seroton10@gmail.com>
parents: 15322
diff changeset
  2052
    The patches must not be applied, and at least one patch is required. Exact
e6c44dbe902f mq: Document that qdel requires exact patch identifiers
Olav Reinert <seroton10@gmail.com>
parents: 15322
diff changeset
  2053
    patch identifiers must be given. With -k/--keep, the patch files are
e6c44dbe902f mq: Document that qdel requires exact patch identifiers
Olav Reinert <seroton10@gmail.com>
parents: 15322
diff changeset
  2054
    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
  2055
8be38b624902 mq: no longer mention the deprecated qdelete's --revision option
Cédric Duval <cedricduval@free.fr>
parents: 8894
diff changeset
  2056
    To stop managing a patch and move it into permanent history,
11307
7f72031d4047 mq: use hg reST role some more
Martin Geisler <mg@aragost.com>
parents: 11303
diff changeset
  2057
    use the :hg:`qfinish` command."""
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  2058
    q = repo.mq
3373
9851f46d6ecc mq: change qdel --forget to --rev; accept any revision symbol
Brendan Cully <brendan@kublai.com>
parents: 3243
diff changeset
  2059
    q.delete(repo, patches, opts)
14580
92101ea35015 mq: rename save_dirty to savedirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14579
diff changeset
  2060
    q.savedirty()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2061
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2062
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2063
@command("qapplied",
16188
6b52963ced73 mq: fix qapplied --last and qprev documentation (issue3282)
Patrick Mezard <patrick@mezard.eu>
parents: 16119
diff changeset
  2064
         [('1', 'last', None, _('show only the preceding applied patch'))
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2065
          ] + seriesopts,
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2066
         _('hg qapplied [-1] [-s] [PATCH]'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2067
def applied(ui, repo, patch=None, **opts):
12538
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2068
    """print the patches already applied
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2069
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2070
    Returns 0 on success."""
9364
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  2071
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  2072
    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
  2073
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  2074
    if patch:
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  2075
        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
  2076
            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
  2077
        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
  2078
    else:
14586
af91cb281975 mq: rename series_end to seriesend
Adrian Buehlmann <adrian@cadifra.com>
parents: 14585
diff changeset
  2079
        end = q.seriesend(True)
9364
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  2080
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  2081
    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
  2082
        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
  2083
        return 1
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  2084
    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
  2085
        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
  2086
        return 1
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  2087
    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
  2088
        start = end - 2
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  2089
        end = 1
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  2090
    else:
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  2091
        start = 0
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  2092
12539
dece1f46f7a2 mq: removed return from callers to patchheader.qseries
Erik Zielke <ez@aragost.com>
parents: 12538
diff changeset
  2093
    q.qseries(repo, length=end, start=start, status='A',
dece1f46f7a2 mq: removed return from callers to patchheader.qseries
Erik Zielke <ez@aragost.com>
parents: 12538
diff changeset
  2094
              summary=opts.get('summary'))
dece1f46f7a2 mq: removed return from callers to patchheader.qseries
Erik Zielke <ez@aragost.com>
parents: 12538
diff changeset
  2095
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2096
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2097
@command("qunapplied",
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2098
         [('1', 'first', None, _('show only the first patch'))] + seriesopts,
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2099
         _('hg qunapplied [-1] [-s] [PATCH]'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2100
def unapplied(ui, repo, patch=None, **opts):
12538
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2101
    """print the patches not yet applied
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2102
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2103
    Returns 0 on success."""
9364
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  2104
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  2105
    q = repo.mq
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  2106
    if patch:
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  2107
        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
  2108
            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
  2109
        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
  2110
    else:
14586
af91cb281975 mq: rename series_end to seriesend
Adrian Buehlmann <adrian@cadifra.com>
parents: 14585
diff changeset
  2111
        start = q.seriesend(True)
9364
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  2112
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  2113
    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
  2114
        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
  2115
        return 1
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  2116
c7c2dd7524dd mq: add options to qapplied/qunapplied to act like qprev/qnext
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9338
diff changeset
  2117
    length = opts.get('first') and 1 or None
12539
dece1f46f7a2 mq: removed return from callers to patchheader.qseries
Erik Zielke <ez@aragost.com>
parents: 12538
diff changeset
  2118
    q.qseries(repo, start=start, length=length, status='U',
dece1f46f7a2 mq: removed return from callers to patchheader.qseries
Erik Zielke <ez@aragost.com>
parents: 12538
diff changeset
  2119
              summary=opts.get('summary'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2120
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2121
@command("qimport",
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2122
         [('e', 'existing', None, _('import file in patch directory')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2123
          ('n', 'name', '',
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2124
           _('name of patch file'), _('NAME')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2125
          ('f', 'force', None, _('overwrite existing files')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2126
          ('r', 'rev', [],
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2127
           _('place existing revisions under mq control'), _('REV')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2128
          ('g', 'git', None, _('use git extended diff format')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2129
          ('P', 'push', None, _('qpush after importing'))],
16988
f2dbe7ba11e2 qimport: use [FILE]... because if -r is used no file is needed
Thomas Arendsen Hein <thomas@intevation.de>
parents: 16987
diff changeset
  2130
         _('hg qimport [-e] [-n NAME] [-f] [-g] [-P] [-r REV]... [FILE]...'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2131
def qimport(ui, repo, *filename, **opts):
16152
816211dfa3a5 mq: expand qimport summary
Matt Mackall <mpm@selenic.com>
parents: 16128
diff changeset
  2132
    """import a patch or existing changeset
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  2133
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2134
    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
  2135
    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
  2136
    to the series.
d6caebe9c293 mq: qimport: explain insertion point in doc string
Adrian Buehlmann <adrian@cadifra.com>
parents: 6627
diff changeset
  2137
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  2138
    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
  2139
    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
  2140
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2141
    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
  2142
    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
  2143
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  2144
    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
  2145
    overwritten.
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  2146
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  2147
    An existing changeset may be placed under mq control with -r/--rev
19397
42fc6c7c4ad5 mq: remove reference to tip
Matt Mackall <mpm@selenic.com>
parents: 19395
diff changeset
  2148
    (e.g. qimport --rev . -n patch will place the current revision
42fc6c7c4ad5 mq: remove reference to tip
Matt Mackall <mpm@selenic.com>
parents: 19395
diff changeset
  2149
    under mq control). With -g/--git, patches imported with --rev will
42fc6c7c4ad5 mq: remove reference to tip
Matt Mackall <mpm@selenic.com>
parents: 19395
diff changeset
  2150
    use the git diff format. See the diffs help topic for information
42fc6c7c4ad5 mq: remove reference to tip
Matt Mackall <mpm@selenic.com>
parents: 19395
diff changeset
  2151
    on why this is important for preserving rename/copy information
42fc6c7c4ad5 mq: remove reference to tip
Matt Mackall <mpm@selenic.com>
parents: 19395
diff changeset
  2152
    and permission changes. Use :hg:`qfinish` to remove changesets
42fc6c7c4ad5 mq: remove reference to tip
Matt Mackall <mpm@selenic.com>
parents: 19395
diff changeset
  2153
    from mq control.
8075
1f0a5a5fff43 Update qimport help explaining how to read a patch from stdin (Issue371)
David Frey <dpfrey@shaw.ca>
parents: 8028
diff changeset
  2154
1f0a5a5fff43 Update qimport help explaining how to read a patch from stdin (Issue371)
David Frey <dpfrey@shaw.ca>
parents: 8028
diff changeset
  2155
    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
  2156
    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
  2157
    using the --name flag.
11700
52c863295754 mq: document possible combination of -e and -n for qimport
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11699
diff changeset
  2158
11706
5fdf08b6b50c mq: correct qimport documentation
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11701
diff changeset
  2159
    To import an existing patch while renaming it::
11700
52c863295754 mq: document possible combination of -e and -n for qimport
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11699
diff changeset
  2160
52c863295754 mq: document possible combination of -e and -n for qimport
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11699
diff changeset
  2161
      hg qimport -e existing-patch -n new-name
12538
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2162
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2163
    Returns 0 if import succeeded.
3141
e21337e06952 mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully <brendan@kublai.com>
parents: 3133
diff changeset
  2164
    """
16027
29ea059be33c qimport: when mq.secret=True set qimported revision as secret
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16026
diff changeset
  2165
    lock = repo.lock() # cause this may move phase
11462
1b82a26635d7 mq: qimport cleanup on fail (issue2214)
Vishakh H <vsh426@gmail.com>
parents: 11439
diff changeset
  2166
    try:
16027
29ea059be33c qimport: when mq.secret=True set qimported revision as secret
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16026
diff changeset
  2167
        q = repo.mq
29ea059be33c qimport: when mq.secret=True set qimported revision as secret
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16026
diff changeset
  2168
        try:
16119
5de83d9ca79c mq: make qimport --push push all imported patches (issue3130)
Patrick Mezard <patrick@mezard.eu>
parents: 16101
diff changeset
  2169
            imported = q.qimport(
5de83d9ca79c mq: make qimport --push push all imported patches (issue3130)
Patrick Mezard <patrick@mezard.eu>
parents: 16101
diff changeset
  2170
                repo, filename, patchname=opts.get('name'),
5de83d9ca79c mq: make qimport --push push all imported patches (issue3130)
Patrick Mezard <patrick@mezard.eu>
parents: 16101
diff changeset
  2171
                existing=opts.get('existing'), force=opts.get('force'),
5de83d9ca79c mq: make qimport --push push all imported patches (issue3130)
Patrick Mezard <patrick@mezard.eu>
parents: 16101
diff changeset
  2172
                rev=opts.get('rev'), git=opts.get('git'))
16027
29ea059be33c qimport: when mq.secret=True set qimported revision as secret
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16026
diff changeset
  2173
        finally:
29ea059be33c qimport: when mq.secret=True set qimported revision as secret
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16026
diff changeset
  2174
            q.savedirty()
11462
1b82a26635d7 mq: qimport cleanup on fail (issue2214)
Vishakh H <vsh426@gmail.com>
parents: 11439
diff changeset
  2175
    finally:
16027
29ea059be33c qimport: when mq.secret=True set qimported revision as secret
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16026
diff changeset
  2176
        lock.release()
16681
0128cdb846d9 mq: qimport need wlock for --push - do that after releasing lock
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16635
diff changeset
  2177
0128cdb846d9 mq: qimport need wlock for --push - do that after releasing lock
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16635
diff changeset
  2178
    if imported and opts.get('push') and not opts.get('rev'):
0128cdb846d9 mq: qimport need wlock for --push - do that after releasing lock
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16635
diff changeset
  2179
        return q.push(repo, imported[-1])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2180
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2181
10480
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  2182
def qinit(ui, repo, create):
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  2183
    """initialize a new queue repository
2754
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  2184
10480
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  2185
    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
  2186
    an mq-specific .hgignore file in the queue repository, to exclude
12538
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2187
    the status and guards files (these contain mostly transient state).
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2188
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2189
    Returns 0 if initialization succeeded."""
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  2190
    q = repo.mq
10480
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  2191
    r = q.init(repo, create)
14580
92101ea35015 mq: rename save_dirty to savedirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14579
diff changeset
  2192
    q.savedirty()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2193
    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
  2194
        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
  2195
            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
  2196
            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
  2197
            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
  2198
            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
  2199
            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
  2200
            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
  2201
            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
  2202
        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
  2203
            r.wopener('series', 'w').close()
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11302
diff changeset
  2204
        r[None].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
  2205
        commands.add(ui, r)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2206
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2207
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2208
@command("^qinit",
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2209
         [('c', 'create-repo', None, _('create queue repository'))],
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2210
         _('hg qinit [-c]'))
10480
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  2211
def init(ui, repo, **opts):
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  2212
    """init a new queue repository (DEPRECATED)
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  2213
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  2214
    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
  2215
    -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
  2216
    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
  2217
    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
  2218
    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
  2219
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  2220
    This command is deprecated. Without -c, it's implied by other relevant
11193
687c7d395f20 Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents: 11121
diff changeset
  2221
    commands. With -c, use :hg:`init --mq` instead."""
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2222
    return qinit(ui, repo, create=opts.get('create_repo'))
10480
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  2223
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2224
@command("qclone",
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2225
         [('', 'pull', None, _('use pull protocol to copy metadata')),
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16657
diff changeset
  2226
          ('U', 'noupdate', None,
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16657
diff changeset
  2227
           _('do not update the new working directories')),
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2228
          ('', 'uncompressed', None,
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2229
           _('use uncompressed transfer (fast over LAN)')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2230
          ('p', 'patches', '',
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2231
           _('location of source patch repository'), _('REPO')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2232
         ] + commands.remoteopts,
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2233
         _('hg qclone [OPTION]... SOURCE [DEST]'))
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  2234
def clone(ui, source, dest=None, **opts):
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  2235
    '''clone main and patch repository at same time
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  2236
7983
7b813bdbd5d0 Change double spaces to single spaces in help texts.
Martin Geisler <mg@daimi.au.dk>
parents: 7874
diff changeset
  2237
    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
  2238
    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
  2239
    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
  2240
    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
  2241
    before that it has no patches applied.
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  2242
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  2243
    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
  2244
    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
  2245
8760
bf17aeafb869 Spell Mercurial as a proper noun
timeless <timeless@gmail.com>
parents: 8711
diff changeset
  2246
    The patch directory must be a nested Mercurial repository, as
11193
687c7d395f20 Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents: 11121
diff changeset
  2247
    would be created by :hg:`init --mq`.
12538
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2248
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2249
    Return 0 on success.
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  2250
    '''
5226
438ff951df70 avoid double slash problem mentioned in issue695
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5180
diff changeset
  2251
    def patchdir(repo):
15921
92e455f2866c qclone: add a few comment and blank line
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15920
diff changeset
  2252
        """compute a patch repo url from a repo object"""
5226
438ff951df70 avoid double slash problem mentioned in issue695
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5180
diff changeset
  2253
        url = repo.url()
438ff951df70 avoid double slash problem mentioned in issue695
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5180
diff changeset
  2254
        if url.endswith('/'):
438ff951df70 avoid double slash problem mentioned in issue695
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5180
diff changeset
  2255
            url = url[:-1]
438ff951df70 avoid double slash problem mentioned in issue695
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5180
diff changeset
  2256
        return url + '/.hg/patches'
15921
92e455f2866c qclone: add a few comment and blank line
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15920
diff changeset
  2257
92e455f2866c qclone: add a few comment and blank line
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15920
diff changeset
  2258
    # main repo (destination and sources)
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  2259
    if dest is None:
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  2260
        dest = hg.defaultdest(source)
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17153
diff changeset
  2261
    sr = hg.peer(ui, opts, ui.expandpath(source))
15921
92e455f2866c qclone: add a few comment and blank line
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15920
diff changeset
  2262
92e455f2866c qclone: add a few comment and blank line
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15920
diff changeset
  2263
    # patches repo (source only)
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2264
    if opts.get('patches'):
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2265
        patchespath = ui.expandpath(opts.get('patches'))
7729
dd08e1e0cea1 mq: allow qclone's -p option to use path alias
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7639
diff changeset
  2266
    else:
dd08e1e0cea1 mq: allow qclone's -p option to use path alias
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7639
diff changeset
  2267
        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
  2268
    try:
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17153
diff changeset
  2269
        hg.peer(ui, opts, patchespath)
7637
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 7627
diff changeset
  2270
    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
  2271
        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
  2272
                           ' (see init --mq)'))
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  2273
    qbase, destrev = None, None
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  2274
    if sr.local():
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17153
diff changeset
  2275
        repo = sr.local()
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17153
diff changeset
  2276
        if repo.mq.applied and repo[qbase].phase() != phases.secret:
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17153
diff changeset
  2277
            qbase = repo.mq.applied[0].node
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  2278
            if not hg.islocal(dest):
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17153
diff changeset
  2279
                heads = set(repo.heads())
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17153
diff changeset
  2280
                destrev = list(heads.difference(repo.heads(qbase)))
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17153
diff changeset
  2281
                destrev.append(repo.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
  2282
    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
  2283
        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
  2284
            qbase = sr.lookup('qbase')
7637
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 7627
diff changeset
  2285
        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
  2286
            pass
15921
92e455f2866c qclone: add a few comment and blank line
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15920
diff changeset
  2287
8027
9c7ca86fc658 expand "repo" to "repository" in help texts
Martin Geisler <mg@lazybytes.net>
parents: 8026
diff changeset
  2288
    ui.note(_('cloning main repository\n'))
14553
d976542986d2 hg: add opts argument to clone for internal remoteui
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14529
diff changeset
  2289
    sr, dr = hg.clone(ui, opts, sr.url(), dest,
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2290
                      pull=opts.get('pull'),
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  2291
                      rev=destrev,
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  2292
                      update=False,
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2293
                      stream=opts.get('uncompressed'))
15921
92e455f2866c qclone: add a few comment and blank line
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15920
diff changeset
  2294
8027
9c7ca86fc658 expand "repo" to "repository" in help texts
Martin Geisler <mg@lazybytes.net>
parents: 8026
diff changeset
  2295
    ui.note(_('cloning patch repository\n'))
14553
d976542986d2 hg: add opts argument to clone for internal remoteui
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14529
diff changeset
  2296
    hg.clone(ui, opts, opts.get('patches') or patchdir(sr), patchdir(dr),
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2297
             pull=opts.get('pull'), update=not opts.get('noupdate'),
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2298
             stream=opts.get('uncompressed'))
15921
92e455f2866c qclone: add a few comment and blank line
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15920
diff changeset
  2299
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  2300
    if dr.local():
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17153
diff changeset
  2301
        repo = dr.local()
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  2302
        if qbase:
8027
9c7ca86fc658 expand "repo" to "repository" in help texts
Martin Geisler <mg@lazybytes.net>
parents: 8026
diff changeset
  2303
            ui.note(_('stripping applied patches from destination '
9c7ca86fc658 expand "repo" to "repository" in help texts
Martin Geisler <mg@lazybytes.net>
parents: 8026
diff changeset
  2304
                      'repository\n'))
19819
f0fc4d5797e1 mq: extract `mq.queue.strip`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19818
diff changeset
  2305
            strip(ui, repo, [qbase], update=False, backup=None)
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2306
        if not opts.get('noupdate'):
8027
9c7ca86fc658 expand "repo" to "repository" in help texts
Martin Geisler <mg@lazybytes.net>
parents: 8026
diff changeset
  2307
            ui.note(_('updating destination repository\n'))
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17153
diff changeset
  2308
            hg.update(repo, repo.changelog.tip())
2720
c91ca61c8953 mq: add qclone command
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2713
diff changeset
  2309
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2310
@command("qcommit|qci",
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2311
         commands.table["^commit|ci"][1],
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2312
         _('hg qcommit [OPTION]... [FILE]...'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2313
def commit(ui, repo, *pats, **opts):
10361
49cd2e7fd91c mq: deprecate qinit and qcommit
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10360
diff changeset
  2314
    """commit changes in the queue repository (DEPRECATED)
49cd2e7fd91c mq: deprecate qinit and qcommit
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10360
diff changeset
  2315
11193
687c7d395f20 Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents: 11121
diff changeset
  2316
    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
  2317
    q = repo.mq
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2318
    r = q.qrepo()
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  2319
    if not r:
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  2320
        raise util.Abort('no queue repository')
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2321
    commands.commit(r.ui, r, *pats, **opts)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2322
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2323
@command("qseries",
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2324
         [('m', 'missing', None, _('print patches not in series')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2325
         ] + seriesopts,
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2326
          _('hg qseries [-ms]'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2327
def series(ui, repo, **opts):
12538
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2328
    """print the entire series file
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2329
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2330
    Returns 0 on success."""
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16657
diff changeset
  2331
    repo.mq.qseries(repo, missing=opts.get('missing'),
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16657
diff changeset
  2332
                    summary=opts.get('summary'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2333
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2334
14468
755aabb3eada mq: no need to make a copy of seriesopts
Idan Kamara <idankk86@gmail.com>
parents: 14464
diff changeset
  2335
@command("qtop", seriesopts, _('hg qtop [-s]'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2336
def top(ui, repo, **opts):
12538
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2337
    """print the name of the current patch
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2338
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2339
    Returns 0 on success."""
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  2340
    q = repo.mq
14586
af91cb281975 mq: rename series_end to seriesend
Adrian Buehlmann <adrian@cadifra.com>
parents: 14585
diff changeset
  2341
    t = q.applied and q.seriesend(True) or 0
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  2342
    if t:
12539
dece1f46f7a2 mq: removed return from callers to patchheader.qseries
Erik Zielke <ez@aragost.com>
parents: 12538
diff changeset
  2343
        q.qseries(repo, start=t - 1, length=1, status='A',
dece1f46f7a2 mq: removed return from callers to patchheader.qseries
Erik Zielke <ez@aragost.com>
parents: 12538
diff changeset
  2344
                  summary=opts.get('summary'))
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  2345
    else:
7627
fb32ae9c76e7 mq: lowercase output
Martin Geisler <mg@daimi.au.dk>
parents: 7621
diff changeset
  2346
        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
  2347
        return 1
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2348
14468
755aabb3eada mq: no need to make a copy of seriesopts
Idan Kamara <idankk86@gmail.com>
parents: 14464
diff changeset
  2349
@command("qnext", seriesopts, _('hg qnext [-s]'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2350
def next(ui, repo, **opts):
16063
c36db39b3fee mq: fix qnext when all remaining patches are guarded
Patrick Mezard <pmezard@gmail.com>
parents: 16048
diff changeset
  2351
    """print the name of the next pushable patch
12538
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2352
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2353
    Returns 0 on success."""
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  2354
    q = repo.mq
14586
af91cb281975 mq: rename series_end to seriesend
Adrian Buehlmann <adrian@cadifra.com>
parents: 14585
diff changeset
  2355
    end = q.seriesend()
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  2356
    if end == len(q.series):
7627
fb32ae9c76e7 mq: lowercase output
Martin Geisler <mg@daimi.au.dk>
parents: 7621
diff changeset
  2357
        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
  2358
        return 1
12539
dece1f46f7a2 mq: removed return from callers to patchheader.qseries
Erik Zielke <ez@aragost.com>
parents: 12538
diff changeset
  2359
    q.qseries(repo, start=end, length=1, summary=opts.get('summary'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2360
14468
755aabb3eada mq: no need to make a copy of seriesopts
Idan Kamara <idankk86@gmail.com>
parents: 14464
diff changeset
  2361
@command("qprev", seriesopts, _('hg qprev [-s]'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2362
def prev(ui, repo, **opts):
16188
6b52963ced73 mq: fix qapplied --last and qprev documentation (issue3282)
Patrick Mezard <patrick@mezard.eu>
parents: 16119
diff changeset
  2363
    """print the name of the preceding applied patch
12538
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2364
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2365
    Returns 0 on success."""
3183
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  2366
    q = repo.mq
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  2367
    l = len(q.applied)
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  2368
    if l == 1:
7627
fb32ae9c76e7 mq: lowercase output
Martin Geisler <mg@daimi.au.dk>
parents: 7621
diff changeset
  2369
        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
  2370
        return 1
0e6b58c7beea mq: add --summary to qapplied, qunapplied, qtop, qnext and qprev
Brendan Cully <brendan@kublai.com>
parents: 3141
diff changeset
  2371
    if not l:
7627
fb32ae9c76e7 mq: lowercase output
Martin Geisler <mg@daimi.au.dk>
parents: 7621
diff changeset
  2372
        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
  2373
        return 1
16064
7e5a281a082c mq: make qprev return the previous applied patch (issue3245)
Patrick Mezard <pmezard@gmail.com>
parents: 16063
diff changeset
  2374
    idx = q.series.index(q.applied[-2].name)
7e5a281a082c mq: make qprev return the previous applied patch (issue3245)
Patrick Mezard <pmezard@gmail.com>
parents: 16063
diff changeset
  2375
    q.qseries(repo, start=idx, length=1, status='A',
12539
dece1f46f7a2 mq: removed return from callers to patchheader.qseries
Erik Zielke <ez@aragost.com>
parents: 12538
diff changeset
  2376
              summary=opts.get('summary'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2377
5673
dd3ce7515f4d mq: add --currentuser and --user options to qnew and qrefresh
peter.arrenbrecht@gmail.com
parents: 5645
diff changeset
  2378
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
  2379
    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
  2380
        opts['user'] = ui.username()
f16ec85f125c mq: do not call ui.username unless it is necessary
Martin Geisler <mg@lazybytes.net>
parents: 9725
diff changeset
  2381
    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
  2382
        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
  2383
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2384
@command("^qnew",
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2385
         [('e', 'edit', None, _('edit commit message')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2386
          ('f', 'force', None, _('import uncommitted changes (DEPRECATED)')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2387
          ('g', 'git', None, _('use git extended diff format')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2388
          ('U', 'currentuser', None, _('add "From: <current user>" to patch')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2389
          ('u', 'user', '',
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2390
           _('add "From: <USER>" to patch'), _('USER')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2391
          ('D', 'currentdate', None, _('add "Date: <current date>" to patch')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2392
          ('d', 'date', '',
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2393
           _('add "Date: <DATE>" to patch'), _('DATE'))
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2394
          ] + commands.walkopts + commands.commitopts,
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2395
         _('hg qnew [-e] [-m TEXT] [-l FILE] PATCH [FILE]...'))
4713
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
  2396
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
  2397
    """create a new patch
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  2398
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2399
    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
  2400
    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
  2401
    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
  2402
    -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
  2403
    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
  2404
    as uncommitted modifications.
2754
19041b8cbc86 Add more verbose help text to mq commands.
Brendan Cully <brendan@kublai.com>
parents: 2753
diff changeset
  2405
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  2406
    -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
  2407
    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
  2408
    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
  2409
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  2410
    -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
  2411
    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
  2412
    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
  2413
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  2414
    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
  2415
    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
  2416
    is important for preserving permission changes and copy/rename
7e9a15fa6c8f update help on git diffs
Matt Mackall <mpm@selenic.com>
parents: 7308
diff changeset
  2417
    information.
12538
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2418
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2419
    Returns 0 on successful creation of a new patch.
7306
8e46e59aaf4c mq: reflow qnew help, add help for options
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7297
diff changeset
  2420
    """
14635
217b7d83afc3 cmdutil, logmessage: use ui.fin when reading from '-'
Idan Kamara <idankk86@gmail.com>
parents: 14620
diff changeset
  2421
    msg = cmdutil.logmessage(ui, opts)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  2422
    def getmsg():
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2423
        return ui.edit(msg, opts.get('user') or ui.username())
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  2424
    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
  2425
    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
  2426
    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
  2427
        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
  2428
    else:
fd3cba5e73ae mq: do not invoke editor until just before patch creation. Closes issue1346.
Brendan Cully <brendan@kublai.com>
parents: 7142
diff changeset
  2429
        opts['msg'] = msg
5673
dd3ce7515f4d mq: add --currentuser and --user options to qnew and qrefresh
peter.arrenbrecht@gmail.com
parents: 5645
diff changeset
  2430
    setupheaderopts(ui, opts)
4713
c29ee52e0b68 mq: support qnew -I/-X and file name lists
Brendan Cully <brendan@kublai.com>
parents: 4712
diff changeset
  2431
    q.new(repo, patch, *args, **opts)
14580
92101ea35015 mq: rename save_dirty to savedirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14579
diff changeset
  2432
    q.savedirty()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2433
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2434
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2435
@command("^qrefresh",
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2436
         [('e', 'edit', None, _('edit commit message')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2437
          ('g', 'git', None, _('use git extended diff format')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2438
          ('s', 'short', None,
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2439
           _('refresh only files already in the patch and specified files')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2440
          ('U', 'currentuser', None,
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2441
           _('add/update author field in patch with current user')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2442
          ('u', 'user', '',
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2443
           _('add/update author field in patch with given user'), _('USER')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2444
          ('D', 'currentdate', None,
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2445
           _('add/update date field in patch with current date')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2446
          ('d', 'date', '',
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2447
           _('add/update date field in patch with given date'), _('DATE'))
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2448
          ] + commands.walkopts + commands.commitopts,
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2449
         _('hg qrefresh [-I] [-X] [-e] [-m TEXT] [-l FILE] [-s] [FILE]...'))
2938
5b7a118f5b6c allow qrefresh to take a list of files; closes #96.
Brendan Cully <brendan@kublai.com>
parents: 2937
diff changeset
  2450
def refresh(ui, repo, *pats, **opts):
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2451
    """update the current patch
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2452
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2453
    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
  2454
    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
  2455
    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
  2456
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  2457
    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
  2458
    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
  2459
11947
59ec12093261 mq: save qrefresh message for easy recovery in case it fails (issue2062)
Renato Cunha <renatoc@gmail.com>
parents: 11939
diff changeset
  2460
    If -e/--edit is specified, Mercurial will start your configured editor for
59ec12093261 mq: save qrefresh message for easy recovery in case it fails (issue2062)
Renato Cunha <renatoc@gmail.com>
parents: 11939
diff changeset
  2461
    you to enter a message. In case qrefresh fails, you will find a backup of
59ec12093261 mq: save qrefresh message for easy recovery in case it fails (issue2062)
Renato Cunha <renatoc@gmail.com>
parents: 11939
diff changeset
  2462
    your message in ``.hg/last-message.txt``.
59ec12093261 mq: save qrefresh message for easy recovery in case it fails (issue2062)
Renato Cunha <renatoc@gmail.com>
parents: 11939
diff changeset
  2463
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2464
    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
  2465
    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
  2466
    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
  2467
    git diff format.
12538
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2468
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2469
    Returns 0 on success.
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2470
    """
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  2471
    q = repo.mq
14635
217b7d83afc3 cmdutil, logmessage: use ui.fin when reading from '-'
Idan Kamara <idankk86@gmail.com>
parents: 14620
diff changeset
  2472
    message = cmdutil.logmessage(ui, opts)
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2473
    if opts.get('edit'):
5334
448eb46d4d84 mq: fix qrefresh -e with no patches applied
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5226
diff changeset
  2474
        if not q.applied:
7627
fb32ae9c76e7 mq: lowercase output
Martin Geisler <mg@daimi.au.dk>
parents: 7621
diff changeset
  2475
            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
  2476
            return 1
2746
0503eb5c0a33 Add option -e/--edit to qrefresh, to edit the existing header.
Brendan Cully <brendan@kublai.com>
parents: 2745
diff changeset
  2477
        if message:
0503eb5c0a33 Add option -e/--edit to qrefresh, to edit the existing header.
Brendan Cully <brendan@kublai.com>
parents: 2745
diff changeset
  2478
            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
  2479
        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
  2480
        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
  2481
        message = ui.edit('\n'.join(ph.message), ph.user or ui.username())
11947
59ec12093261 mq: save qrefresh message for easy recovery in case it fails (issue2062)
Renato Cunha <renatoc@gmail.com>
parents: 11939
diff changeset
  2482
        # We don't want to lose the patch message if qrefresh fails (issue2062)
14529
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14509
diff changeset
  2483
        repo.savecommitmessage(message)
5673
dd3ce7515f4d mq: add --currentuser and --user options to qnew and qrefresh
peter.arrenbrecht@gmail.com
parents: 5645
diff changeset
  2484
    setupheaderopts(ui, opts)
14620
2b9c32929e62 mq: make qrefresh/qfold keep wlock until saving patch status
Yuya Nishihara <yuya@tcha.org>
parents: 14600
diff changeset
  2485
    wlock = repo.wlock()
2b9c32929e62 mq: make qrefresh/qfold keep wlock until saving patch status
Yuya Nishihara <yuya@tcha.org>
parents: 14600
diff changeset
  2486
    try:
2b9c32929e62 mq: make qrefresh/qfold keep wlock until saving patch status
Yuya Nishihara <yuya@tcha.org>
parents: 14600
diff changeset
  2487
        ret = q.refresh(repo, pats, msg=message, **opts)
2b9c32929e62 mq: make qrefresh/qfold keep wlock until saving patch status
Yuya Nishihara <yuya@tcha.org>
parents: 14600
diff changeset
  2488
        q.savedirty()
2b9c32929e62 mq: make qrefresh/qfold keep wlock until saving patch status
Yuya Nishihara <yuya@tcha.org>
parents: 14600
diff changeset
  2489
        return ret
2b9c32929e62 mq: make qrefresh/qfold keep wlock until saving patch status
Yuya Nishihara <yuya@tcha.org>
parents: 14600
diff changeset
  2490
    finally:
2b9c32929e62 mq: make qrefresh/qfold keep wlock until saving patch status
Yuya Nishihara <yuya@tcha.org>
parents: 14600
diff changeset
  2491
        wlock.release()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2492
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2493
@command("^qdiff",
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2494
         commands.diffopts + commands.diffopts2 + commands.walkopts,
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2495
         _('hg qdiff [OPTION]... [FILE]...'))
2937
9dc568f5e03d Fix test-mq-qdiff; add -I and -X options to qdiff
Brendan Cully <brendan@kublai.com>
parents: 2936
diff changeset
  2496
def diff(ui, repo, *pats, **opts):
6606
088ba40585b9 mq: expand help text for qdiff
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6561
diff changeset
  2497
    """diff of the current patch and subsequent modifications
6621
d5cbbe2c49ce mq: lose the trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6611
diff changeset
  2498
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2499
    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
  2500
    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
  2501
    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
  2502
    after a qrefresh).
6621
d5cbbe2c49ce mq: lose the trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6611
diff changeset
  2503
10973
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10962
diff changeset
  2504
    Use :hg:`diff` if you only want to see the changes made since the
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10962
diff changeset
  2505
    last qrefresh, or :hg:`export qtip` if you want to see changes
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10962
diff changeset
  2506
    made by the current patch without including changes made since the
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2507
    qrefresh.
12538
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2508
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2509
    Returns 0 on success.
6606
088ba40585b9 mq: expand help text for qdiff
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6561
diff changeset
  2510
    """
2937
9dc568f5e03d Fix test-mq-qdiff; add -I and -X options to qdiff
Brendan Cully <brendan@kublai.com>
parents: 2936
diff changeset
  2511
    repo.mq.diff(repo, pats, opts)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2512
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2513
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2514
@command('qfold',
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2515
         [('e', 'edit', None, _('edit patch header')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2516
          ('k', 'keep', None, _('keep folded patch files')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2517
         ] + commands.commitopts,
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2518
         _('hg qfold [-e] [-k] [-m TEXT] [-l FILE] PATCH...'))
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2519
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
  2520
    """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
  2521
2771
519bf0cd28d2 Add -f option to qfold; improve qfold documentation.
Brendan Cully <brendan@kublai.com>
parents: 2770
diff changeset
  2522
    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
  2523
    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
  2524
    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
  2525
    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
  2526
    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
  2527
    removed afterwards.
2771
519bf0cd28d2 Add -f option to qfold; improve qfold documentation.
Brendan Cully <brendan@kublai.com>
parents: 2770
diff changeset
  2528
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2529
    The header for each folded patch will be concatenated with the
12755
db79d3627872 mq: switched to `` around * * *
Erik Zielke <ez@aragost.com>
parents: 12689
diff changeset
  2530
    current patch header, separated by a line of ``* * *``.
12538
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2531
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2532
    Returns 0 on success."""
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2533
    q = repo.mq
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2534
    if not files:
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2535
        raise util.Abort(_('qfold requires at least one patch name'))
14581
da40ee1adc2b mq: rename check_toppatch to checktoppatch
Adrian Buehlmann <adrian@cadifra.com>
parents: 14580
diff changeset
  2536
    if not q.checktoppatch(repo)[0]:
12067
a4fbbe0fbc38 Lowercase error messages
Martin Geisler <mg@lazybytes.net>
parents: 11965
diff changeset
  2537
        raise util.Abort(_('no patches applied'))
14583
28f87e14d923 mq: rename check_localchanges to checklocalchanges
Adrian Buehlmann <adrian@cadifra.com>
parents: 14582
diff changeset
  2538
    q.checklocalchanges(repo)
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2539
14635
217b7d83afc3 cmdutil, logmessage: use ui.fin when reading from '-'
Idan Kamara <idankk86@gmail.com>
parents: 14620
diff changeset
  2540
    message = cmdutil.logmessage(ui, opts)
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2541
    if opts.get('edit'):
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2542
        if message:
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2543
            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
  2544
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2545
    parent = q.lookup('qtip')
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2546
    patches = []
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2547
    messages = []
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2548
    for f in files:
2936
21bf8929efc8 Fix qfold after recent changes
Brendan Cully <brendan@kublai.com>
parents: 2934
diff changeset
  2549
        p = q.lookup(f)
21bf8929efc8 Fix qfold after recent changes
Brendan Cully <brendan@kublai.com>
parents: 2934
diff changeset
  2550
        if p in patches or p == parent:
16929
4b02d7006169 mq: lowercase warning messages
Martin Geisler <mg@aragost.com>
parents: 16867
diff changeset
  2551
            ui.warn(_('skipping already folded patch %s\n') % p)
2936
21bf8929efc8 Fix qfold after recent changes
Brendan Cully <brendan@kublai.com>
parents: 2934
diff changeset
  2552
        if q.isapplied(p):
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16657
diff changeset
  2553
            raise util.Abort(_('qfold cannot fold already applied patch %s')
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16657
diff changeset
  2554
                             % p)
2936
21bf8929efc8 Fix qfold after recent changes
Brendan Cully <brendan@kublai.com>
parents: 2934
diff changeset
  2555
        patches.append(p)
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2556
2936
21bf8929efc8 Fix qfold after recent changes
Brendan Cully <brendan@kublai.com>
parents: 2934
diff changeset
  2557
    for p in patches:
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2558
        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
  2559
            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
  2560
            if ph.message:
1d5ecaa47abb mq: filter out empty commit messages in qfold
Brendan Cully <brendan@kublai.com>
parents: 7453
diff changeset
  2561
                messages.append(ph.message)
2936
21bf8929efc8 Fix qfold after recent changes
Brendan Cully <brendan@kublai.com>
parents: 2934
diff changeset
  2562
        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
  2563
        (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
  2564
        if not patchsuccess:
12067
a4fbbe0fbc38 Lowercase error messages
Martin Geisler <mg@lazybytes.net>
parents: 11965
diff changeset
  2565
            raise util.Abort(_('error folding patch %s') % p)
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2566
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2567
    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
  2568
        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
  2569
        message, user = ph.message, ph.user
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2570
        for msg in messages:
20053
2455e96ec73b mq: don't add '* * *' separators when there is no commit message
Mads Kiilerich <madski@unity3d.com>
parents: 19997
diff changeset
  2571
            if msg:
2455e96ec73b mq: don't add '* * *' separators when there is no commit message
Mads Kiilerich <madski@unity3d.com>
parents: 19997
diff changeset
  2572
                if message:
2455e96ec73b mq: don't add '* * *' separators when there is no commit message
Mads Kiilerich <madski@unity3d.com>
parents: 19997
diff changeset
  2573
                    message.append('* * *')
2455e96ec73b mq: don't add '* * *' separators when there is no commit message
Mads Kiilerich <madski@unity3d.com>
parents: 19997
diff changeset
  2574
                message.extend(msg)
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2575
        message = '\n'.join(message)
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2576
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2577
    if opts.get('edit'):
2753
84218111e80f Add -m, -l, -e options to qfold.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2578
        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
  2579
10186
296a0b14a686 mq: preserve --git flag when folding patches
Patrick Mezard <pmezard@gmail.com>
parents: 10185
diff changeset
  2580
    diffopts = q.patchopts(q.diffopts(), *patches)
14620
2b9c32929e62 mq: make qrefresh/qfold keep wlock until saving patch status
Yuya Nishihara <yuya@tcha.org>
parents: 14600
diff changeset
  2581
    wlock = repo.wlock()
2b9c32929e62 mq: make qrefresh/qfold keep wlock until saving patch status
Yuya Nishihara <yuya@tcha.org>
parents: 14600
diff changeset
  2582
    try:
2b9c32929e62 mq: make qrefresh/qfold keep wlock until saving patch status
Yuya Nishihara <yuya@tcha.org>
parents: 14600
diff changeset
  2583
        q.refresh(repo, msg=message, git=diffopts.git)
2b9c32929e62 mq: make qrefresh/qfold keep wlock until saving patch status
Yuya Nishihara <yuya@tcha.org>
parents: 14600
diff changeset
  2584
        q.delete(repo, patches, opts)
2b9c32929e62 mq: make qrefresh/qfold keep wlock until saving patch status
Yuya Nishihara <yuya@tcha.org>
parents: 14600
diff changeset
  2585
        q.savedirty()
2b9c32929e62 mq: make qrefresh/qfold keep wlock until saving patch status
Yuya Nishihara <yuya@tcha.org>
parents: 14600
diff changeset
  2586
    finally:
2b9c32929e62 mq: make qrefresh/qfold keep wlock until saving patch status
Yuya Nishihara <yuya@tcha.org>
parents: 14600
diff changeset
  2587
        wlock.release()
2748
752b9475a700 New mq command qfold: Merge patches into the current patch.
Brendan Cully <brendan@kublai.com>
parents: 2747
diff changeset
  2588
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2589
@command("qgoto",
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  2590
         [('', 'keep-changes', None,
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  2591
           _('tolerate non-conflicting local changes')),
16655
6ca125af882f mq: introduce qgoto --check
Patrick Mezard <patrick@mezard.eu>
parents: 16654
diff changeset
  2592
          ('f', 'force', None, _('overwrite any local changes')),
16635
9d76320d8b99 mq: add --no-backup for qpush/qpop/qgoto
Patrick Mezard <patrick@mezard.eu>
parents: 16634
diff changeset
  2593
          ('', 'no-backup', None, _('do not save backup copies of files'))],
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2594
         _('hg qgoto [OPTION]... PATCH'))
4432
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  2595
def goto(ui, repo, patch, **opts):
12538
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2596
    '''push or pop patches until named patch is at top of stack
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2597
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2598
    Returns 0 on success.'''
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  2599
    opts = fixkeepchangesopts(ui, opts)
4432
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  2600
    q = repo.mq
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  2601
    patch = q.lookup(patch)
16635
9d76320d8b99 mq: add --no-backup for qpush/qpop/qgoto
Patrick Mezard <patrick@mezard.eu>
parents: 16634
diff changeset
  2602
    nobackup = opts.get('no_backup')
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  2603
    keepchanges = opts.get('keep_changes')
4432
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  2604
    if q.isapplied(patch):
16655
6ca125af882f mq: introduce qgoto --check
Patrick Mezard <patrick@mezard.eu>
parents: 16654
diff changeset
  2605
        ret = q.pop(repo, patch, force=opts.get('force'), nobackup=nobackup,
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  2606
                    keepchanges=keepchanges)
4432
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  2607
    else:
16655
6ca125af882f mq: introduce qgoto --check
Patrick Mezard <patrick@mezard.eu>
parents: 16654
diff changeset
  2608
        ret = q.push(repo, patch, force=opts.get('force'), nobackup=nobackup,
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  2609
                     keepchanges=keepchanges)
14580
92101ea35015 mq: rename save_dirty to savedirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14579
diff changeset
  2610
    q.savedirty()
4432
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  2611
    return ret
905397be7688 mq: add qgoto command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4430
diff changeset
  2612
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2613
@command("qguard",
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2614
         [('l', 'list', None, _('list all patches and guards')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2615
          ('n', 'none', None, _('drop all guards'))],
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2616
         _('hg qguard [-l] [-n] [PATCH] [-- [+GUARD]... [-GUARD]...]'))
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2617
def guard(ui, repo, *args, **opts):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2618
    '''set or print guards for a patch
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2619
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2620
    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
  2621
    guards is always pushed. A patch with a positive guard ("+foo") is
11307
7f72031d4047 mq: use hg reST role some more
Martin Geisler <mg@aragost.com>
parents: 11303
diff changeset
  2622
    pushed only if the :hg:`qselect` command has activated it. A patch with
7f72031d4047 mq: use hg reST role some more
Martin Geisler <mg@aragost.com>
parents: 11303
diff changeset
  2623
    a negative guard ("-foo") is never pushed if the :hg:`qselect` command
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2624
    has activated it.
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2625
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2626
    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
  2627
    With arguments, set guards for the named patch.
12389
4ac734b9b3fd Use note admonition
Erik Zielke <ez@aragost.com>
parents: 12380
diff changeset
  2628
4ac734b9b3fd Use note admonition
Erik Zielke <ez@aragost.com>
parents: 12380
diff changeset
  2629
    .. note::
19997
de16c673455b documentation: add an extra newline after note directive
Simon Heimberg <simohe@besonet.ch>
parents: 19951
diff changeset
  2630
12389
4ac734b9b3fd Use note admonition
Erik Zielke <ez@aragost.com>
parents: 12380
diff changeset
  2631
       Specifying negative guards now requires '--'.
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2632
9824
87c92b260710 mq: fix literal blocks in docstrings
Martin Geisler <mg@lazybytes.net>
parents: 9733
diff changeset
  2633
    To set guards on another patch::
87c92b260710 mq: fix literal blocks in docstrings
Martin Geisler <mg@lazybytes.net>
parents: 9733
diff changeset
  2634
10476
3113736dbac5 mq: more instructive use of "--" in qguard help (issue2040)
Martin Geisler <mg@lazybytes.net>
parents: 10413
diff changeset
  2635
      hg qguard other.patch -- +2.6.17 -stable
12538
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2636
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2637
    Returns 0 on success.
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2638
    '''
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2639
    def status(idx):
14573
d590ff1f22b2 mq: rename series_guards to seriesguards
Adrian Buehlmann <adrian@cadifra.com>
parents: 14572
diff changeset
  2640
        guards = q.seriesguards[idx] or ['unguarded']
11819
1c00577b0298 qguard: label patch names by status when listing guards
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11789
diff changeset
  2641
        if q.series[idx] in applied:
1c00577b0298 qguard: label patch names by status when listing guards
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11789
diff changeset
  2642
            state = 'applied'
1c00577b0298 qguard: label patch names by status when listing guards
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11789
diff changeset
  2643
        elif q.pushable(idx)[0]:
1c00577b0298 qguard: label patch names by status when listing guards
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11789
diff changeset
  2644
            state = 'unapplied'
1c00577b0298 qguard: label patch names by status when listing guards
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11789
diff changeset
  2645
        else:
1c00577b0298 qguard: label patch names by status when listing guards
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11789
diff changeset
  2646
            state = 'guarded'
1c00577b0298 qguard: label patch names by status when listing guards
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11789
diff changeset
  2647
        label = 'qguard.patch qguard.%s qseries.%s' % (state, state)
1c00577b0298 qguard: label patch names by status when listing guards
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11789
diff changeset
  2648
        ui.write('%s: ' % ui.label(q.series[idx], label))
1c00577b0298 qguard: label patch names by status when listing guards
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11789
diff changeset
  2649
10822
4c63f8e787b8 qguard: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10814
diff changeset
  2650
        for i, guard in enumerate(guards):
4c63f8e787b8 qguard: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10814
diff changeset
  2651
            if guard.startswith('+'):
11310
ac873ecfc3c2 Backed out changeset: e1dde7363601
Steve Borho <steve@borho.org>
parents: 11302
diff changeset
  2652
                ui.write(guard, label='qguard.positive')
10822
4c63f8e787b8 qguard: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10814
diff changeset
  2653
            elif guard.startswith('-'):
11310
ac873ecfc3c2 Backed out changeset: e1dde7363601
Steve Borho <steve@borho.org>
parents: 11302
diff changeset
  2654
                ui.write(guard, label='qguard.negative')
10822
4c63f8e787b8 qguard: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10814
diff changeset
  2655
            else:
11310
ac873ecfc3c2 Backed out changeset: e1dde7363601
Steve Borho <steve@borho.org>
parents: 11302
diff changeset
  2656
                ui.write(guard, label='qguard.unguarded')
10822
4c63f8e787b8 qguard: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10814
diff changeset
  2657
            if i != len(guards) - 1:
11310
ac873ecfc3c2 Backed out changeset: e1dde7363601
Steve Borho <steve@borho.org>
parents: 11302
diff changeset
  2658
                ui.write(' ')
ac873ecfc3c2 Backed out changeset: e1dde7363601
Steve Borho <steve@borho.org>
parents: 11302
diff changeset
  2659
        ui.write('\n')
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2660
    q = repo.mq
11819
1c00577b0298 qguard: label patch names by status when listing guards
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11789
diff changeset
  2661
    applied = set(p.name for p in q.applied)
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2662
    patch = None
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2663
    args = list(args)
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2664
    if opts.get('list'):
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2665
        if args or opts.get('none'):
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16657
diff changeset
  2666
            raise util.Abort(_('cannot mix -l/--list with options or '
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16657
diff changeset
  2667
                               'arguments'))
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2668
        for i in xrange(len(q.series)):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2669
            status(i)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2670
        return
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2671
    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
  2672
        if not q.applied:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2673
            raise util.Abort(_('no patches applied'))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2674
        patch = q.applied[-1].name
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2675
    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
  2676
        patch = args.pop(0)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2677
    if patch is None:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2678
        raise util.Abort(_('no patch to work with'))
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2679
    if args or opts.get('none'):
14574
12fba7bcb4f1 mq: rename find_series to findseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14573
diff changeset
  2680
        idx = q.findseries(patch)
4133
a9ee6c53af8d mq: abort cleanly when invalid patch name is given to qguard
Christian Ebert <blacktrash@gmx.net>
parents: 4090
diff changeset
  2681
        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
  2682
            raise util.Abort(_('no patch named %s') % patch)
14577
76357276662e mq: rename set_guards to setguards
Adrian Buehlmann <adrian@cadifra.com>
parents: 14576
diff changeset
  2683
        q.setguards(idx, args)
14580
92101ea35015 mq: rename save_dirty to savedirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14579
diff changeset
  2684
        q.savedirty()
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2685
    else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2686
        status(q.series.index(q.lookup(patch)))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2687
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2688
@command("qheader", [], _('hg qheader [PATCH]'))
2747
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  2689
def header(ui, repo, patch=None):
12538
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2690
    """print the header of the topmost or specified patch
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2691
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2692
    Returns 0 on success."""
2747
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  2693
    q = repo.mq
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  2694
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  2695
    if patch:
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  2696
        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
  2697
    else:
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  2698
        if not q.applied:
10510
f77f3383c666 i18n: mark more strings for translation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10498
diff changeset
  2699
            ui.write(_('no patches applied\n'))
3008
c203ccd7d838 qheader: exit withh meaningful error code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 3006
diff changeset
  2700
            return 1
2747
0016fc748f61 Add command qheader to display the header of a given patch.
Brendan Cully <brendan@kublai.com>
parents: 2746
diff changeset
  2701
        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
  2702
    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
  2703
7399
e71bda2d2087 mq: create patch header class to abstract header manipulation
Brendan Cully <brendan@kublai.com>
parents: 7398
diff changeset
  2704
    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
  2705
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2706
def lastsavename(path):
2794
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
  2707
    (directory, base) = os.path.split(path)
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
  2708
    names = os.listdir(directory)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2709
    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
  2710
    maxindex = None
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2711
    maxname = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2712
    for f in names:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2713
        m = namere.match(f)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2714
        if m:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2715
            index = int(m.group(1))
8527
f9a80054dd3c use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents: 8525
diff changeset
  2716
            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
  2717
                maxindex = index
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2718
                maxname = f
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2719
    if maxname:
2794
86c54b7cd331 mq: fix variables shadowing builtin
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2792
diff changeset
  2720
        return (os.path.join(directory, maxname), maxindex)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2721
    return (None, None)
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2722
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2723
def savename(path):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2724
    (last, index) = lastsavename(path)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2725
    if last is None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2726
        index = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2727
    newpath = path + ".%d" % (index + 1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2728
    return newpath
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2729
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2730
@command("^qpush",
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  2731
         [('', 'keep-changes', None,
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  2732
           _('tolerate non-conflicting local changes')),
16654
490ed8972f1b mq: introduce qpush --check
Patrick Mezard <patrick@mezard.eu>
parents: 16653
diff changeset
  2733
          ('f', 'force', None, _('apply on top of local changes')),
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16657
diff changeset
  2734
          ('e', 'exact', None,
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16657
diff changeset
  2735
           _('apply the target patch to its recorded parent')),
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2736
          ('l', 'list', None, _('list patch name in commit text')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2737
          ('a', 'all', None, _('apply all patches')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2738
          ('m', 'merge', None, _('merge from another queue (DEPRECATED)')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2739
          ('n', 'name', '',
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2740
           _('merge queue name (DEPRECATED)'), _('NAME')),
16635
9d76320d8b99 mq: add --no-backup for qpush/qpop/qgoto
Patrick Mezard <patrick@mezard.eu>
parents: 16634
diff changeset
  2741
          ('', 'move', None,
9d76320d8b99 mq: add --no-backup for qpush/qpop/qgoto
Patrick Mezard <patrick@mezard.eu>
parents: 16634
diff changeset
  2742
           _('reorder patch series and apply only the patch')),
9d76320d8b99 mq: add --no-backup for qpush/qpop/qgoto
Patrick Mezard <patrick@mezard.eu>
parents: 16634
diff changeset
  2743
          ('', 'no-backup', None, _('do not save backup copies of files'))],
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2744
         _('hg qpush [-f] [-l] [-a] [--move] [PATCH | INDEX]'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2745
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
  2746
    """push the next patch onto the stack
6553
0bb76d168437 remove trailing spaces
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6552
diff changeset
  2747
16654
490ed8972f1b mq: introduce qpush --check
Patrick Mezard <patrick@mezard.eu>
parents: 16653
diff changeset
  2748
    By default, abort if the working directory contains uncommitted
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  2749
    changes. With --keep-changes, abort only if the uncommitted files
16654
490ed8972f1b mq: introduce qpush --check
Patrick Mezard <patrick@mezard.eu>
parents: 16653
diff changeset
  2750
    overlap with patched files. With -f/--force, backup and patch over
490ed8972f1b mq: introduce qpush --check
Patrick Mezard <patrick@mezard.eu>
parents: 16653
diff changeset
  2751
    uncommitted changes.
12538
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2752
13725
6783f47d90dd mq: fix typo in docstring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 13632
diff changeset
  2753
    Return 0 on success.
6552
315b36ce6251 mq: add a little documentation on qpush -f
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6382
diff changeset
  2754
    """
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  2755
    q = repo.mq
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2756
    mergeq = None
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2757
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  2758
    opts = fixkeepchangesopts(ui, opts)
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2759
    if opts.get('merge'):
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2760
        if opts.get('name'):
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2761
            newpath = repo.join(opts.get('name'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2762
        else:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2763
            newpath, i = lastsavename(q.path)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2764
        if not newpath:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  2765
            ui.warn(_("no saved queues found, please use -n\n"))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2766
            return 1
19064
743daa601445 mq: do not inherit settings form base repo in mqrepo (Fixes issue2358)
Simon Heimberg <simohe@besonet.ch>
parents: 18958
diff changeset
  2767
        mergeq = queue(ui, repo.baseui, repo.path, newpath)
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  2768
        ui.warn(_("merging with queue at: %s\n") % mergeq.path)
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2769
    ret = q.push(repo, patch, force=opts.get('force'), list=opts.get('list'),
13033
026053f691a4 mq: add an '-e/--exact' option to qpush
Steve Losh <steve@stevelosh.com>
parents: 13031
diff changeset
  2770
                 mergeq=mergeq, all=opts.get('all'), move=opts.get('move'),
16654
490ed8972f1b mq: introduce qpush --check
Patrick Mezard <patrick@mezard.eu>
parents: 16653
diff changeset
  2771
                 exact=opts.get('exact'), nobackup=opts.get('no_backup'),
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  2772
                 keepchanges=opts.get('keep_changes'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2773
    return ret
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2774
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2775
@command("^qpop",
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2776
         [('a', 'all', None, _('pop all patches')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2777
          ('n', 'name', '',
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2778
           _('queue name to pop (DEPRECATED)'), _('NAME')),
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  2779
          ('', 'keep-changes', None,
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  2780
           _('tolerate non-conflicting local changes')),
16635
9d76320d8b99 mq: add --no-backup for qpush/qpop/qgoto
Patrick Mezard <patrick@mezard.eu>
parents: 16634
diff changeset
  2781
          ('f', 'force', None, _('forget any local changes to patched files')),
9d76320d8b99 mq: add --no-backup for qpush/qpop/qgoto
Patrick Mezard <patrick@mezard.eu>
parents: 16634
diff changeset
  2782
          ('', 'no-backup', None, _('do not save backup copies of files'))],
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2783
         _('hg qpop [-a] [-f] [PATCH | INDEX]'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2784
def pop(ui, repo, patch=None, **opts):
6611
f4c612da788d mq: add correct documentation for qpop
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6610
diff changeset
  2785
    """pop the current patch off the stack
6621
d5cbbe2c49ce mq: lose the trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6611
diff changeset
  2786
16653
73b8c2554be8 mq: introduce qpop --check
Patrick Mezard <patrick@mezard.eu>
parents: 16635
diff changeset
  2787
    Without argument, pops off the top of the patch stack. If given a
73b8c2554be8 mq: introduce qpop --check
Patrick Mezard <patrick@mezard.eu>
parents: 16635
diff changeset
  2788
    patch name, keeps popping off patches until the named patch is at
73b8c2554be8 mq: introduce qpop --check
Patrick Mezard <patrick@mezard.eu>
parents: 16635
diff changeset
  2789
    the top of the stack.
73b8c2554be8 mq: introduce qpop --check
Patrick Mezard <patrick@mezard.eu>
parents: 16635
diff changeset
  2790
73b8c2554be8 mq: introduce qpop --check
Patrick Mezard <patrick@mezard.eu>
parents: 16635
diff changeset
  2791
    By default, abort if the working directory contains uncommitted
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  2792
    changes. With --keep-changes, abort only if the uncommitted files
16653
73b8c2554be8 mq: introduce qpop --check
Patrick Mezard <patrick@mezard.eu>
parents: 16635
diff changeset
  2793
    overlap with patched files. With -f/--force, backup and discard
73b8c2554be8 mq: introduce qpop --check
Patrick Mezard <patrick@mezard.eu>
parents: 16635
diff changeset
  2794
    changes made to such files.
12538
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2795
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2796
    Return 0 on success.
6611
f4c612da788d mq: add correct documentation for qpop
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6610
diff changeset
  2797
    """
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  2798
    opts = fixkeepchangesopts(ui, opts)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2799
    localupdate = True
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2800
    if opts.get('name'):
19064
743daa601445 mq: do not inherit settings form base repo in mqrepo (Fixes issue2358)
Simon Heimberg <simohe@besonet.ch>
parents: 18958
diff changeset
  2801
        q = queue(ui, repo.baseui, repo.path, repo.join(opts.get('name')))
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  2802
        ui.warn(_('using patch queue: %s\n') % q.path)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2803
        localupdate = False
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2804
    else:
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  2805
        q = repo.mq
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2806
    ret = q.pop(repo, patch, force=opts.get('force'), update=localupdate,
16653
73b8c2554be8 mq: introduce qpop --check
Patrick Mezard <patrick@mezard.eu>
parents: 16635
diff changeset
  2807
                all=opts.get('all'), nobackup=opts.get('no_backup'),
16733
4da10c00a20c mq: rename --check into --keep-changes
Patrick Mezard <patrick@mezard.eu>
parents: 16718
diff changeset
  2808
                keepchanges=opts.get('keep_changes'))
14580
92101ea35015 mq: rename save_dirty to savedirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14579
diff changeset
  2809
    q.savedirty()
4099
cf5580c16b13 mq: propagate the return error of pop
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4096
diff changeset
  2810
    return ret
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2811
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2812
@command("qrename|qmv", [], _('hg qrename PATCH1 [PATCH2]'))
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2813
def rename(ui, repo, patch, name=None, **opts):
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2814
    """rename a patch
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2815
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2816
    With one argument, renames the current patch to PATCH1.
12538
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2817
    With two arguments, renames PATCH1 to PATCH2.
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2818
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2819
    Returns 0 on success."""
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2820
    q = repo.mq
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2821
    if not name:
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2822
        name = patch
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2823
        patch = None
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2824
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2825
    if patch:
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2826
        patch = q.lookup(patch)
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2827
    else:
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2828
        if not q.applied:
7627
fb32ae9c76e7 mq: lowercase output
Martin Geisler <mg@daimi.au.dk>
parents: 7621
diff changeset
  2829
            ui.write(_('no patches applied\n'))
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2830
            return
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2831
        patch = q.lookup('qtip')
3083
82c9d1aac308 Make qrename handle directory targets; closes #333.
Brendan Cully <brendan@kublai.com>
parents: 3082
diff changeset
  2832
    absdest = q.join(name)
82c9d1aac308 Make qrename handle directory targets; closes #333.
Brendan Cully <brendan@kublai.com>
parents: 3082
diff changeset
  2833
    if os.path.isdir(absdest):
4037
bbdba01cce28 Enforce unixish style for all generated patch names.
Patrick Mezard <pmezard@gmail.com>
parents: 4016
diff changeset
  2834
        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
  2835
        absdest = q.join(name)
14423
7230aef66b7c mq: use checkpatchname
Idan Kamara <idankk86@gmail.com>
parents: 14422
diff changeset
  2836
    q.checkpatchname(name)
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2837
10510
f77f3383c666 i18n: mark more strings for translation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10498
diff changeset
  2838
    ui.note(_('renaming %s to %s\n') % (patch, name))
14574
12fba7bcb4f1 mq: rename find_series to findseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14573
diff changeset
  2839
    i = q.findseries(patch)
14572
8ff2957c1d82 mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14564
diff changeset
  2840
    guards = q.guard_re.findall(q.fullseries[i])
8ff2957c1d82 mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14564
diff changeset
  2841
    q.fullseries[i] = name + ''.join([' #' + g for g in guards])
14575
845c864200d0 mq: rename parse_series to parseseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14574
diff changeset
  2842
    q.parseseries()
15879
710e6bf15538 mq: consistently use boolean values for dirty flags
Mads Kiilerich <mads@kiilerich.com>
parents: 15878
diff changeset
  2843
    q.seriesdirty = True
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2844
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2845
    info = q.isapplied(patch)
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2846
    if info:
2818
bdc067ff6cf5 Make mq camelcase consistent with the rest of hg.
Brendan Cully <brendan@kublai.com>
parents: 2816
diff changeset
  2847
        q.applied[info[0]] = statusentry(info[1], name)
15879
710e6bf15538 mq: consistently use boolean values for dirty flags
Mads Kiilerich <mads@kiilerich.com>
parents: 15878
diff changeset
  2848
    q.applieddirty = True
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2849
11513
0c944b7af564 mq: fixed ENOENT when qrename to new/directory.patch
Yuya Nishihara <yuya@tcha.org>
parents: 11462
diff changeset
  2850
    destdir = os.path.dirname(absdest)
0c944b7af564 mq: fixed ENOENT when qrename to new/directory.patch
Yuya Nishihara <yuya@tcha.org>
parents: 11462
diff changeset
  2851
    if not os.path.isdir(destdir):
0c944b7af564 mq: fixed ENOENT when qrename to new/directory.patch
Yuya Nishihara <yuya@tcha.org>
parents: 11462
diff changeset
  2852
        os.makedirs(destdir)
2819
766ecdc83e43 mq: add join method
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2818
diff changeset
  2853
    util.rename(q.join(patch), absdest)
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2854
    r = q.qrepo()
12875
b59b5193d4d0 mq: qrename should not touch the dirstate if src is untracked (issue2460)
Patrick Mezard <pmezard@gmail.com>
parents: 12850
diff changeset
  2855
    if r and patch in r.dirstate:
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11302
diff changeset
  2856
        wctx = r[None]
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2857
        wlock = r.wlock()
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  2858
        try:
6648
2519976a998b mq: handle added patch renaming correctly
Weijun Wang <weijun.wang@sun.com>
parents: 6635
diff changeset
  2859
            if r.dirstate[patch] == 'a':
14434
cc8c09855d19 dirstate: rename forget to drop
Matt Mackall <mpm@selenic.com>
parents: 14424
diff changeset
  2860
                r.dirstate.drop(patch)
6648
2519976a998b mq: handle added patch renaming correctly
Weijun Wang <weijun.wang@sun.com>
parents: 6635
diff changeset
  2861
                r.dirstate.add(name)
2519976a998b mq: handle added patch renaming correctly
Weijun Wang <weijun.wang@sun.com>
parents: 6635
diff changeset
  2862
            else:
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11302
diff changeset
  2863
                wctx.copy(patch, name)
14435
5f6090e559fa context: make forget work like commands.forget
Matt Mackall <mpm@selenic.com>
parents: 14434
diff changeset
  2864
                wctx.forget([patch])
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4906
diff changeset
  2865
        finally:
8112
6ee71f78497c switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8076
diff changeset
  2866
            wlock.release()
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2867
14580
92101ea35015 mq: rename save_dirty to savedirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14579
diff changeset
  2868
    q.savedirty()
2750
8c814c1ab31e New self-explanatory command qrename.
Brendan Cully <brendan@kublai.com>
parents: 2748
diff changeset
  2869
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2870
@command("qrestore",
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2871
         [('d', 'delete', None, _('delete save entry')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2872
          ('u', 'update', None, _('update queue working directory'))],
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2873
         _('hg qrestore [-d] [-u] REV'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2874
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
  2875
    """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
  2876
12352
5be733b20bd1 mq: fix the deprecation comment for qsave & qrestore.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12344
diff changeset
  2877
    This command is deprecated, use :hg:`rebase` instead."""
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2878
    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
  2879
    q = repo.mq
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2880
    q.restore(repo, rev, delete=opts.get('delete'),
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2881
              qupdate=opts.get('update'))
14580
92101ea35015 mq: rename save_dirty to savedirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14579
diff changeset
  2882
    q.savedirty()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2883
    return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2884
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2885
@command("qsave",
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2886
         [('c', 'copy', None, _('copy patch directory')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2887
          ('n', 'name', '',
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2888
           _('copy directory name'), _('NAME')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2889
          ('e', 'empty', None, _('clear queue status file')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2890
          ('f', 'force', None, _('force copy'))] + commands.commitopts,
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2891
         _('hg qsave [-m TEXT] [-l FILE] [-c] [-n NAME] [-e] [-f]'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2892
def save(ui, repo, **opts):
10360
bcf90e712dc3 mq: deprecate qsave, qrestore and related options
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10359
diff changeset
  2893
    """save current queue state (DEPRECATED)
bcf90e712dc3 mq: deprecate qsave, qrestore and related options
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10359
diff changeset
  2894
12352
5be733b20bd1 mq: fix the deprecation comment for qsave & qrestore.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12344
diff changeset
  2895
    This command is deprecated, use :hg:`rebase` instead."""
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  2896
    q = repo.mq
14635
217b7d83afc3 cmdutil, logmessage: use ui.fin when reading from '-'
Idan Kamara <idankk86@gmail.com>
parents: 14620
diff changeset
  2897
    message = cmdutil.logmessage(ui, opts)
2694
0fb28dbf0dc7 MQ: uniformise message and logfile option.
"Mathieu Clabaut <mathieu.clabaut@gmail.com>"
parents: 2682
diff changeset
  2898
    ret = q.save(repo, msg=message)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2899
    if ret:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2900
        return ret
15880
02b135558756 mq: make qsave implementation more explicit
Mads Kiilerich <mads@kiilerich.com>
parents: 15879
diff changeset
  2901
    q.savedirty() # save to .hg/patches before copying
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2902
    if opts.get('copy'):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2903
        path = q.path
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2904
        if opts.get('name'):
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2905
            newpath = os.path.join(q.basepath, opts.get('name'))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2906
            if os.path.exists(newpath):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2907
                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
  2908
                    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
  2909
                                       'a directory') % newpath)
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2910
                if not opts.get('force'):
2712
8e5cd8d11b51 mq: move many error messages to util.Abort
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2711
diff changeset
  2911
                    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
  2912
                                       'use -f to force') % newpath)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2913
        else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2914
            newpath = savename(path)
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  2915
        ui.warn(_("copy %s to %s\n") % (path, newpath))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2916
        util.copyfiles(path, newpath)
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2917
    if opts.get('empty'):
15880
02b135558756 mq: make qsave implementation more explicit
Mads Kiilerich <mads@kiilerich.com>
parents: 15879
diff changeset
  2918
        del q.applied[:]
02b135558756 mq: make qsave implementation more explicit
Mads Kiilerich <mads@kiilerich.com>
parents: 15879
diff changeset
  2919
        q.applieddirty = True
02b135558756 mq: make qsave implementation more explicit
Mads Kiilerich <mads@kiilerich.com>
parents: 15879
diff changeset
  2920
        q.savedirty()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2921
    return 0
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
  2922
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  2923
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2924
@command("qselect",
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2925
         [('n', 'none', None, _('disable all guards')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2926
          ('s', 'series', None, _('list all guards in series file')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2927
          ('', 'pop', None, _('pop to before first guarded applied patch')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2928
          ('', 'reapply', None, _('pop, then reapply patches'))],
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  2929
         _('hg qselect [OPTION]... [GUARD]...'))
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2930
def select(ui, repo, *args, **opts):
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2931
    '''set or print guarded patches to push
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2932
11307
7f72031d4047 mq: use hg reST role some more
Martin Geisler <mg@aragost.com>
parents: 11303
diff changeset
  2933
    Use the :hg:`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
  2934
    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
  2935
    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
  2936
    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
  2937
    match the current guard. For example::
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2938
13791
794f4476b974 mq: fix qselect help for qguard
timeless@gmail.com
parents: 13725
diff changeset
  2939
        qguard foo.patch -- -stable    (negative guard)
794f4476b974 mq: fix qselect help for qguard
timeless@gmail.com
parents: 13725
diff changeset
  2940
        qguard bar.patch    +stable    (positive guard)
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2941
        qselect stable
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2942
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2943
    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
  2944
    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
  2945
    positive match).
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2946
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2947
    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
  2948
    With one argument, sets the active guard.
3223
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3186
diff changeset
  2949
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2950
    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
  2951
    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
  2952
    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
  2953
2940
b1e6d701a03a mq help text updates and speling fixes
Brendan Cully <brendan@kublai.com>
parents: 2939
diff changeset
  2954
    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
  2955
    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
  2956
    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
  2957
    --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
  2958
    guarded patches.
2844
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2959
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  2960
    Use -s/--series to print a list of all guards in the series file
12538
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2961
    (no other arguments needed). Use -v for more information.
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2962
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  2963
    Returns 0 on success.'''
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2964
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2965
    q = repo.mq
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2966
    guards = q.active()
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2967
    if args or opts.get('none'):
2844
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2968
        old_unapplied = q.unapplied(repo)
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2969
        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
  2970
                       not q.pushable(i)[0]]
14578
28a2646f3b81 mq: rename set_active to setactive
Adrian Buehlmann <adrian@cadifra.com>
parents: 14577
diff changeset
  2971
        q.setactive(args)
14580
92101ea35015 mq: rename save_dirty to savedirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14579
diff changeset
  2972
        q.savedirty()
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2973
        if not args:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2974
            ui.status(_('guards deactivated\n'))
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2975
        if not opts.get('pop') and not opts.get('reapply'):
2844
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2976
            unapplied = q.unapplied(repo)
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2977
            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
  2978
                       if not q.pushable(i)[0]]
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2979
            if len(unapplied) != len(old_unapplied):
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2980
                ui.status(_('number of unguarded, unapplied patches has '
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2981
                            'changed from %d to %d\n') %
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2982
                          (len(old_unapplied), len(unapplied)))
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2983
            if len(guarded) != len(old_guarded):
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2984
                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
  2985
                            'from %d to %d\n') %
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  2986
                          (len(old_guarded), len(guarded)))
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  2987
    elif opts.get('series'):
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2988
        guards = {}
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2989
        noguards = 0
14573
d590ff1f22b2 mq: rename series_guards to seriesguards
Adrian Buehlmann <adrian@cadifra.com>
parents: 14572
diff changeset
  2990
        for gs in q.seriesguards:
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2991
            if not gs:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2992
                noguards += 1
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2993
            for g in gs:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2994
                guards.setdefault(g, 0)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2995
                guards[g] += 1
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2996
        if ui.verbose:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2997
            guards['NONE'] = noguards
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  2998
        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
  2999
        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
  3000
        if guards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  3001
            ui.note(_('guards in series file:\n'))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  3002
            for guard, count in guards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  3003
                ui.note('%2d  ' % count)
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  3004
                ui.write(guard, '\n')
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  3005
        else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  3006
            ui.note(_('no guards in series file\n'))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  3007
    else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  3008
        if guards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  3009
            ui.note(_('active guards:\n'))
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  3010
            for g in guards:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  3011
                ui.write(g, '\n')
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  3012
        else:
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  3013
            ui.write(_('no active guards\n'))
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  3014
    reapply = opts.get('reapply') and q.applied and q.appliedname(-1)
2844
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  3015
    popped = False
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  3016
    if opts.get('pop') or opts.get('reapply'):
2844
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  3017
        for i in xrange(len(q.applied)):
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  3018
            pushable, reason = q.pushable(i)
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  3019
            if not pushable:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  3020
                ui.status(_('popping guarded patches\n'))
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  3021
                popped = True
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  3022
                if i == 0:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  3023
                    q.pop(repo, all=True)
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  3024
                else:
15256
8caf7a757afa mq: fix corner cases for handling of patch 0 in qselect
Mads Kiilerich <mads@kiilerich.com>
parents: 15148
diff changeset
  3025
                    q.pop(repo, str(i - 1))
2844
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  3026
                break
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  3027
    if popped:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  3028
        try:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  3029
            if reapply:
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  3030
                ui.status(_('reapplying unguarded patches\n'))
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  3031
                q.push(repo, reapply)
582cbc4392cb qselect: add --pop, --reapply options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2830
diff changeset
  3032
        finally:
14580
92101ea35015 mq: rename save_dirty to savedirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14579
diff changeset
  3033
            q.savedirty()
2821
2e4ace008c94 mq: new commands qselect, qguard
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2819
diff changeset
  3034
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  3035
@command("qfinish",
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  3036
         [('a', 'applied', None, _('finish all applied changesets'))],
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  3037
         _('hg qfinish [-a] [REV]...'))
6645
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  3038
def finish(ui, repo, *revrange, **opts):
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  3039
    """move applied patches into repository history
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  3040
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  3041
    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
  3042
    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
  3043
    history.
6645
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  3044
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8075
diff changeset
  3045
    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
  3046
    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
  3047
    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
  3048
    stack of applied patches.
6645
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  3049
7994
3c22fdc741d8 mq: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
  3050
    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
  3051
    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
  3052
    to upstream.
12538
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  3053
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  3054
    Returns 0 on success.
6645
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  3055
    """
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  3056
    if not opts.get('applied') and not revrange:
6645
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  3057
        raise util.Abort(_('no revisions specified'))
12281
d9cf0d1d0d0f mq: consistently use opts.get() to prevent potential KeyError
Christian Ebert <blacktrash@gmx.net>
parents: 12266
diff changeset
  3058
    elif opts.get('applied'):
11730
7469ff872122 qfinish: fix range logic for --applied
Matt Mackall <mpm@selenic.com>
parents: 11717
diff changeset
  3059
        revrange = ('qbase::qtip',) + revrange
6645
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  3060
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  3061
    q = repo.mq
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  3062
    if not q.applied:
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  3063
        ui.status(_('no patches applied\n'))
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  3064
        return 0
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  3065
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14298
diff changeset
  3066
    revs = scmutil.revrange(repo, revrange)
15476
7c06e9c35f2f mq: add a warning about uncommitted changes for qfinish
Matt Mackall <mpm@selenic.com>
parents: 15322
diff changeset
  3067
    if repo['.'].rev() in revs and repo[None].files():
7c06e9c35f2f mq: add a warning about uncommitted changes for qfinish
Matt Mackall <mpm@selenic.com>
parents: 15322
diff changeset
  3068
        ui.warn(_('warning: uncommitted changes in the working directory\n'))
17512
39e7e74b3cd3 spelling: responsibility
timeless@mozdev.org
parents: 17191
diff changeset
  3069
    # queue.finish may changes phases but leave the responsibility to lock the
15920
885e0c71db9b mq: turn changeset draft on qfinish (except if qparent is secret)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15883
diff changeset
  3070
    # repo to the caller to avoid deadlock with wlock. This command code is
17424
e7cfe3587ea4 fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents: 17191
diff changeset
  3071
    # responsibility for this locking.
15920
885e0c71db9b mq: turn changeset draft on qfinish (except if qparent is secret)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15883
diff changeset
  3072
    lock = repo.lock()
885e0c71db9b mq: turn changeset draft on qfinish (except if qparent is secret)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15883
diff changeset
  3073
    try:
885e0c71db9b mq: turn changeset draft on qfinish (except if qparent is secret)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15883
diff changeset
  3074
        q.finish(repo, revs)
885e0c71db9b mq: turn changeset draft on qfinish (except if qparent is secret)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15883
diff changeset
  3075
        q.savedirty()
885e0c71db9b mq: turn changeset draft on qfinish (except if qparent is secret)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15883
diff changeset
  3076
    finally:
885e0c71db9b mq: turn changeset draft on qfinish (except if qparent is secret)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15883
diff changeset
  3077
        lock.release()
6645
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  3078
    return 0
37eedb1a1848 mq: introduce the qfinish command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6644
diff changeset
  3079
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  3080
@command("qqueue",
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  3081
         [('l', 'list', False, _('list all available queues')),
14987
3709cca378ff mq/qqueue: print current queue name
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 14943
diff changeset
  3082
          ('', 'active', False, _('print name of active queue')),
14298
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  3083
          ('c', 'create', False, _('create new queue')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  3084
          ('', 'rename', False, _('rename active queue')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  3085
          ('', 'delete', False, _('delete reference to queue')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  3086
          ('', 'purge', False, _('delete queue, and remove patch dir')),
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  3087
         ],
21719639276d mq: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14267
diff changeset
  3088
         _('[OPTION] [QUEUE]'))
11229
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3089
def qqueue(ui, repo, name=None, **opts):
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3090
    '''manage multiple patch queues
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3091
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3092
    Supports switching between different patch queues, as well as creating
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3093
    new patch queues and deleting existing ones.
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3094
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3095
    Omitting a queue name or specifying -l/--list will show you the registered
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3096
    queues - by default the "normal" patches queue is registered. The currently
14987
3709cca378ff mq/qqueue: print current queue name
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 14943
diff changeset
  3097
    active queue will be marked with "(active)". Specifying --active will print
3709cca378ff mq/qqueue: print current queue name
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 14943
diff changeset
  3098
    only the name of the active queue.
11229
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3099
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3100
    To create a new queue, use -c/--create. The queue is automatically made
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3101
    active, except in the case where there are applied patches from the
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3102
    currently active queue in the repository. Then the queue will only be
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3103
    created and switching will fail.
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3104
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3105
    To delete an existing queue, use --delete. You cannot delete the currently
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3106
    active queue.
12538
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  3107
c87216e5e43e mq: added return 0 on success
Erik Zielke <ez@aragost.com>
parents: 12508
diff changeset
  3108
    Returns 0 on success.
11229
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3109
    '''
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3110
    q = repo.mq
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3111
    _defaultqueue = 'patches'
11270
457813cb3024 mq: fix naming issues for qqueue directories
Henrik Stuart <hg@hstuart.dk>
parents: 11234
diff changeset
  3112
    _allqueues = 'patches.queues'
457813cb3024 mq: fix naming issues for qqueue directories
Henrik Stuart <hg@hstuart.dk>
parents: 11234
diff changeset
  3113
    _activequeue = 'patches.queue'
11229
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3114
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3115
    def _getcurrent():
11270
457813cb3024 mq: fix naming issues for qqueue directories
Henrik Stuart <hg@hstuart.dk>
parents: 11234
diff changeset
  3116
        cur = os.path.basename(q.path)
457813cb3024 mq: fix naming issues for qqueue directories
Henrik Stuart <hg@hstuart.dk>
parents: 11234
diff changeset
  3117
        if cur.startswith('patches-'):
457813cb3024 mq: fix naming issues for qqueue directories
Henrik Stuart <hg@hstuart.dk>
parents: 11234
diff changeset
  3118
            cur = cur[8:]
457813cb3024 mq: fix naming issues for qqueue directories
Henrik Stuart <hg@hstuart.dk>
parents: 11234
diff changeset
  3119
        return cur
11229
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3120
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3121
    def _noqueues():
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3122
        try:
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3123
            fh = repo.opener(_allqueues, 'r')
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3124
            fh.close()
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3125
        except IOError:
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3126
            return True
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3127
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3128
        return False
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3129
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3130
    def _getqueues():
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3131
        current = _getcurrent()
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3132
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3133
        try:
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3134
            fh = repo.opener(_allqueues, 'r')
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3135
            queues = [queue.strip() for queue in fh if queue.strip()]
13400
14f3795a5ed7 explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13373
diff changeset
  3136
            fh.close()
11229
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3137
            if current not in queues:
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3138
                queues.append(current)
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3139
        except IOError:
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3140
            queues = [_defaultqueue]
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3141
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3142
        return sorted(queues)
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3143
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3144
    def _setactive(name):
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3145
        if q.applied:
17708
4f2f0f367ef6 mq: improve qqueue message with patches applied (issue3036)
Bryan O'Sullivan <bryano@fb.com>
parents: 17537
diff changeset
  3146
            raise util.Abort(_('new queue created, but cannot make active '
4f2f0f367ef6 mq: improve qqueue message with patches applied (issue3036)
Bryan O'Sullivan <bryano@fb.com>
parents: 17537
diff changeset
  3147
                               'as patches are applied'))
11938
b8b1e6e78486 mq/qqueue: split _setactive
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11819
diff changeset
  3148
        _setactivenocheck(name)
b8b1e6e78486 mq/qqueue: split _setactive
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11819
diff changeset
  3149
b8b1e6e78486 mq/qqueue: split _setactive
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11819
diff changeset
  3150
    def _setactivenocheck(name):
11229
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3151
        fh = repo.opener(_activequeue, 'w')
11270
457813cb3024 mq: fix naming issues for qqueue directories
Henrik Stuart <hg@hstuart.dk>
parents: 11234
diff changeset
  3152
        if name != 'patches':
457813cb3024 mq: fix naming issues for qqueue directories
Henrik Stuart <hg@hstuart.dk>
parents: 11234
diff changeset
  3153
            fh.write(name)
11229
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3154
        fh.close()
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3155
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3156
    def _addqueue(name):
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3157
        fh = repo.opener(_allqueues, 'a')
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3158
        fh.write('%s\n' % (name,))
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3159
        fh.close()
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3160
11939
7d2ea5ce4aac mq/qqueue: enable renaming of active queue
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11938
diff changeset
  3161
    def _queuedir(name):
7d2ea5ce4aac mq/qqueue: enable renaming of active queue
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11938
diff changeset
  3162
        if name == 'patches':
7d2ea5ce4aac mq/qqueue: enable renaming of active queue
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11938
diff changeset
  3163
            return repo.join('patches')
7d2ea5ce4aac mq/qqueue: enable renaming of active queue
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11938
diff changeset
  3164
        else:
7d2ea5ce4aac mq/qqueue: enable renaming of active queue
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11938
diff changeset
  3165
            return repo.join('patches-' + name)
7d2ea5ce4aac mq/qqueue: enable renaming of active queue
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11938
diff changeset
  3166
11270
457813cb3024 mq: fix naming issues for qqueue directories
Henrik Stuart <hg@hstuart.dk>
parents: 11234
diff changeset
  3167
    def _validname(name):
457813cb3024 mq: fix naming issues for qqueue directories
Henrik Stuart <hg@hstuart.dk>
parents: 11234
diff changeset
  3168
        for n in name:
457813cb3024 mq: fix naming issues for qqueue directories
Henrik Stuart <hg@hstuart.dk>
parents: 11234
diff changeset
  3169
            if n in ':\\/.':
457813cb3024 mq: fix naming issues for qqueue directories
Henrik Stuart <hg@hstuart.dk>
parents: 11234
diff changeset
  3170
                return False
457813cb3024 mq: fix naming issues for qqueue directories
Henrik Stuart <hg@hstuart.dk>
parents: 11234
diff changeset
  3171
        return True
457813cb3024 mq: fix naming issues for qqueue directories
Henrik Stuart <hg@hstuart.dk>
parents: 11234
diff changeset
  3172
11966
22f1994fb669 mq/qqueue: commonalise the queue deletion code
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11947
diff changeset
  3173
    def _delete(name):
22f1994fb669 mq/qqueue: commonalise the queue deletion code
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11947
diff changeset
  3174
        if name not in existing:
22f1994fb669 mq/qqueue: commonalise the queue deletion code
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11947
diff changeset
  3175
            raise util.Abort(_('cannot delete queue that does not exist'))
22f1994fb669 mq/qqueue: commonalise the queue deletion code
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11947
diff changeset
  3176
22f1994fb669 mq/qqueue: commonalise the queue deletion code
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11947
diff changeset
  3177
        current = _getcurrent()
22f1994fb669 mq/qqueue: commonalise the queue deletion code
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11947
diff changeset
  3178
22f1994fb669 mq/qqueue: commonalise the queue deletion code
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11947
diff changeset
  3179
        if name == current:
22f1994fb669 mq/qqueue: commonalise the queue deletion code
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11947
diff changeset
  3180
            raise util.Abort(_('cannot delete currently active queue'))
22f1994fb669 mq/qqueue: commonalise the queue deletion code
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11947
diff changeset
  3181
22f1994fb669 mq/qqueue: commonalise the queue deletion code
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11947
diff changeset
  3182
        fh = repo.opener('patches.queues.new', 'w')
22f1994fb669 mq/qqueue: commonalise the queue deletion code
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11947
diff changeset
  3183
        for queue in existing:
22f1994fb669 mq/qqueue: commonalise the queue deletion code
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11947
diff changeset
  3184
            if queue == name:
22f1994fb669 mq/qqueue: commonalise the queue deletion code
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11947
diff changeset
  3185
                continue
22f1994fb669 mq/qqueue: commonalise the queue deletion code
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11947
diff changeset
  3186
            fh.write('%s\n' % (queue,))
22f1994fb669 mq/qqueue: commonalise the queue deletion code
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11947
diff changeset
  3187
        fh.close()
22f1994fb669 mq/qqueue: commonalise the queue deletion code
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11947
diff changeset
  3188
        util.rename(repo.join('patches.queues.new'), repo.join(_allqueues))
22f1994fb669 mq/qqueue: commonalise the queue deletion code
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11947
diff changeset
  3189
14987
3709cca378ff mq/qqueue: print current queue name
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 14943
diff changeset
  3190
    if not name or opts.get('list') or opts.get('active'):
11229
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3191
        current = _getcurrent()
14987
3709cca378ff mq/qqueue: print current queue name
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 14943
diff changeset
  3192
        if opts.get('active'):
3709cca378ff mq/qqueue: print current queue name
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 14943
diff changeset
  3193
            ui.write('%s\n' % (current,))
3709cca378ff mq/qqueue: print current queue name
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 14943
diff changeset
  3194
            return
11229
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3195
        for queue in _getqueues():
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3196
            ui.write('%s' % (queue,))
11767
9b771b4ce2f3 mq/qqueue: --list does not print (active) with --quiet
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11730
diff changeset
  3197
            if queue == current and not ui.quiet:
11229
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3198
                ui.write(_(' (active)\n'))
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3199
            else:
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3200
                ui.write('\n')
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3201
        return
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3202
11270
457813cb3024 mq: fix naming issues for qqueue directories
Henrik Stuart <hg@hstuart.dk>
parents: 11234
diff changeset
  3203
    if not _validname(name):
457813cb3024 mq: fix naming issues for qqueue directories
Henrik Stuart <hg@hstuart.dk>
parents: 11234
diff changeset
  3204
        raise util.Abort(
457813cb3024 mq: fix naming issues for qqueue directories
Henrik Stuart <hg@hstuart.dk>
parents: 11234
diff changeset
  3205
                _('invalid queue name, may not contain the characters ":\\/."'))
457813cb3024 mq: fix naming issues for qqueue directories
Henrik Stuart <hg@hstuart.dk>
parents: 11234
diff changeset
  3206
11229
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3207
    existing = _getqueues()
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3208
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3209
    if opts.get('create'):
11271
d1aca0863a9d mq: prevent the creation of a queue whose name is already taken
Cédric Duval <cedricduval@free.fr>
parents: 11270
diff changeset
  3210
        if name in existing:
d1aca0863a9d mq: prevent the creation of a queue whose name is already taken
Cédric Duval <cedricduval@free.fr>
parents: 11270
diff changeset
  3211
            raise util.Abort(_('queue "%s" already exists') % name)
11229
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3212
        if _noqueues():
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3213
            _addqueue(_defaultqueue)
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3214
        _addqueue(name)
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3215
        _setactive(name)
11939
7d2ea5ce4aac mq/qqueue: enable renaming of active queue
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11938
diff changeset
  3216
    elif opts.get('rename'):
11229
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3217
        current = _getcurrent()
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3218
        if name == current:
11939
7d2ea5ce4aac mq/qqueue: enable renaming of active queue
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11938
diff changeset
  3219
            raise util.Abort(_('can\'t rename "%s" to its current name') % name)
7d2ea5ce4aac mq/qqueue: enable renaming of active queue
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11938
diff changeset
  3220
        if name in existing:
7d2ea5ce4aac mq/qqueue: enable renaming of active queue
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11938
diff changeset
  3221
            raise util.Abort(_('queue "%s" already exists') % name)
7d2ea5ce4aac mq/qqueue: enable renaming of active queue
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11938
diff changeset
  3222
7d2ea5ce4aac mq/qqueue: enable renaming of active queue
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11938
diff changeset
  3223
        olddir = _queuedir(current)
7d2ea5ce4aac mq/qqueue: enable renaming of active queue
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11938
diff changeset
  3224
        newdir = _queuedir(name)
7d2ea5ce4aac mq/qqueue: enable renaming of active queue
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11938
diff changeset
  3225
7d2ea5ce4aac mq/qqueue: enable renaming of active queue
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11938
diff changeset
  3226
        if os.path.exists(newdir):
7d2ea5ce4aac mq/qqueue: enable renaming of active queue
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11938
diff changeset
  3227
            raise util.Abort(_('non-queue directory "%s" already exists') %
7d2ea5ce4aac mq/qqueue: enable renaming of active queue
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11938
diff changeset
  3228
                    newdir)
11229
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3229
11270
457813cb3024 mq: fix naming issues for qqueue directories
Henrik Stuart <hg@hstuart.dk>
parents: 11234
diff changeset
  3230
        fh = repo.opener('patches.queues.new', 'w')
11229
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3231
        for queue in existing:
11939
7d2ea5ce4aac mq/qqueue: enable renaming of active queue
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11938
diff changeset
  3232
            if queue == current:
7d2ea5ce4aac mq/qqueue: enable renaming of active queue
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11938
diff changeset
  3233
                fh.write('%s\n' % (name,))
7d2ea5ce4aac mq/qqueue: enable renaming of active queue
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11938
diff changeset
  3234
                if os.path.exists(olddir):
7d2ea5ce4aac mq/qqueue: enable renaming of active queue
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11938
diff changeset
  3235
                    util.rename(olddir, newdir)
7d2ea5ce4aac mq/qqueue: enable renaming of active queue
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11938
diff changeset
  3236
            else:
7d2ea5ce4aac mq/qqueue: enable renaming of active queue
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11938
diff changeset
  3237
                fh.write('%s\n' % (queue,))
11229
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3238
        fh.close()
11270
457813cb3024 mq: fix naming issues for qqueue directories
Henrik Stuart <hg@hstuart.dk>
parents: 11234
diff changeset
  3239
        util.rename(repo.join('patches.queues.new'), repo.join(_allqueues))
11939
7d2ea5ce4aac mq/qqueue: enable renaming of active queue
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11938
diff changeset
  3240
        _setactivenocheck(name)
11229
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3241
    elif opts.get('delete'):
11966
22f1994fb669 mq/qqueue: commonalise the queue deletion code
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11947
diff changeset
  3242
        _delete(name)
11967
6e3875a80533 mq/qqueue: add --purge option to delete a queue and its patch dir
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11966
diff changeset
  3243
    elif opts.get('purge'):
6e3875a80533 mq/qqueue: add --purge option to delete a queue and its patch dir
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11966
diff changeset
  3244
        if name in existing:
6e3875a80533 mq/qqueue: add --purge option to delete a queue and its patch dir
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11966
diff changeset
  3245
            _delete(name)
6e3875a80533 mq/qqueue: add --purge option to delete a queue and its patch dir
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11966
diff changeset
  3246
        qdir = _queuedir(name)
6e3875a80533 mq/qqueue: add --purge option to delete a queue and its patch dir
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11966
diff changeset
  3247
        if os.path.exists(qdir):
6e3875a80533 mq/qqueue: add --purge option to delete a queue and its patch dir
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 11966
diff changeset
  3248
            shutil.rmtree(qdir)
11229
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3249
    else:
11271
d1aca0863a9d mq: prevent the creation of a queue whose name is already taken
Cédric Duval <cedricduval@free.fr>
parents: 11270
diff changeset
  3250
        if name not in existing:
d1aca0863a9d mq: prevent the creation of a queue whose name is already taken
Cédric Duval <cedricduval@free.fr>
parents: 11270
diff changeset
  3251
            raise util.Abort(_('use --create to create a new queue'))
11229
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3252
        _setactive(name)
1e701ffd9df4 mq: support multiple patch queues using qqueue
Henrik Stuart <hg@hstuart.dk>
parents: 11216
diff changeset
  3253
15928
3a51eb88046a mq: ensure mq changesets are set to secret when no phase data are found
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15927
diff changeset
  3254
def mqphasedefaults(repo, roots):
3a51eb88046a mq: ensure mq changesets are set to secret when no phase data are found
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15927
diff changeset
  3255
    """callback used to set mq changeset as secret when no phase data exists"""
3a51eb88046a mq: ensure mq changesets are set to secret when no phase data are found
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15927
diff changeset
  3256
    if repo.mq.applied:
16028
922c0e9b40be mq: take mq.secret configuration into account when picking the default phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16027
diff changeset
  3257
        if repo.ui.configbool('mq', 'secret', False):
922c0e9b40be mq: take mq.secret configuration into account when picking the default phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16027
diff changeset
  3258
            mqphase = phases.secret
922c0e9b40be mq: take mq.secret configuration into account when picking the default phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16027
diff changeset
  3259
        else:
922c0e9b40be mq: take mq.secret configuration into account when picking the default phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16027
diff changeset
  3260
            mqphase = phases.draft
15972
341c58282b25 mq: pass qbase node instead of mq statusentry in phasedefaults
Augie Fackler <durin42@gmail.com>
parents: 15952
diff changeset
  3261
        qbase = repo[repo.mq.applied[0].node]
16028
922c0e9b40be mq: take mq.secret configuration into account when picking the default phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16027
diff changeset
  3262
        roots[mqphase].add(qbase.node())
15928
3a51eb88046a mq: ensure mq changesets are set to secret when no phase data are found
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15927
diff changeset
  3263
    return roots
3a51eb88046a mq: ensure mq changesets are set to secret when no phase data are found
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15927
diff changeset
  3264
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  3265
def reposetup(ui, repo):
2818
bdc067ff6cf5 Make mq camelcase consistent with the rest of hg.
Brendan Cully <brendan@kublai.com>
parents: 2816
diff changeset
  3266
    class mqrepo(repo.__class__):
19395
19622224559b mq: use an unfiltered property cache for the queue object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19212
diff changeset
  3267
        @localrepo.unfilteredpropertycache
8524
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
  3268
        def mq(self):
19064
743daa601445 mq: do not inherit settings form base repo in mqrepo (Fixes issue2358)
Simon Heimberg <simohe@besonet.ch>
parents: 18958
diff changeset
  3269
            return queue(self.ui, self.baseui, self.path)
8524
21c87b299a04 mq: only read files when needed
Simon Heimberg <simohe@besonet.ch>
parents: 8484
diff changeset
  3270
14596
6a0070d00bc8 mq: rename abort_if_wdir_patched to abortifwdirpatched
Adrian Buehlmann <adrian@cadifra.com>
parents: 14595
diff changeset
  3271
        def abortifwdirpatched(self, errmsg, force=False):
19856
28b1b7b9b4a9 shelve: allow shelving of a change with an mq patch applied
David Soria Parra <dsp@experimentalworks.net>
parents: 19826
diff changeset
  3272
            if self.mq.applied and self.mq.checkapplied and not force:
13520
9510ddf87c43 mq: forbid commit of merge involving mq patches
Martin Geisler <mg@aragost.com>
parents: 13508
diff changeset
  3273
                parents = self.dirstate.parents()
9510ddf87c43 mq: forbid commit of merge involving mq patches
Martin Geisler <mg@aragost.com>
parents: 13508
diff changeset
  3274
                patches = [s.node for s in self.mq.applied]
9510ddf87c43 mq: forbid commit of merge involving mq patches
Martin Geisler <mg@aragost.com>
parents: 13508
diff changeset
  3275
                if parents[0] in patches or parents[1] in patches:
2848
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2845
diff changeset
  3276
                    raise util.Abort(errmsg)
3223
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3186
diff changeset
  3277
8711
1b95c6f13155 mq: fix commit prototype
Matt Mackall <mpm@selenic.com>
parents: 8706
diff changeset
  3278
        def commit(self, text="", user=None, date=None, match=None,
1b95c6f13155 mq: fix commit prototype
Matt Mackall <mpm@selenic.com>
parents: 8706
diff changeset
  3279
                   force=False, editor=False, extra={}):
14596
6a0070d00bc8 mq: rename abort_if_wdir_patched to abortifwdirpatched
Adrian Buehlmann <adrian@cadifra.com>
parents: 14595
diff changeset
  3280
            self.abortifwdirpatched(
2848
307439d6fede mq: do not allow to push from repo with patches applied
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2845
diff changeset
  3281
                _('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
  3282
                force)
2845
addd03c7fbfa Disallow commit over an applied mq patch.
Brendan Cully <brendan@kublai.com>
parents: 2844
diff changeset
  3283
8711
1b95c6f13155 mq: fix commit prototype
Matt Mackall <mpm@selenic.com>
parents: 8706
diff changeset
  3284
            return super(mqrepo, self).commit(text, user, date, match, force,
1b95c6f13155 mq: fix commit prototype
Matt Mackall <mpm@selenic.com>
parents: 8706
diff changeset
  3285
                                              editor, extra)
2845
addd03c7fbfa Disallow commit over an applied mq patch.
Brendan Cully <brendan@kublai.com>
parents: 2844
diff changeset
  3286
13327
dc11e30b48a3 mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents: 13256
diff changeset
  3287
        def checkpush(self, force, revs):
19856
28b1b7b9b4a9 shelve: allow shelving of a change with an mq patch applied
David Soria Parra <dsp@experimentalworks.net>
parents: 19826
diff changeset
  3288
            if self.mq.applied and self.mq.checkapplied and not force:
15952
ec8a9e06cf05 mq-safety: don't apply safety on non-outgoing changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15934
diff changeset
  3289
                outapplied = [e.node for e in self.mq.applied]
12378
ab237534d800 mq: always require --force when pushing patches (issue2363)
Patrick Mezard <pmezard@gmail.com>
parents: 12352
diff changeset
  3290
                if revs:
15952
ec8a9e06cf05 mq-safety: don't apply safety on non-outgoing changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15934
diff changeset
  3291
                    # Assume applied patches have no non-patch descendants and
ec8a9e06cf05 mq-safety: don't apply safety on non-outgoing changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15934
diff changeset
  3292
                    # are not on remote already. Filtering any changeset not
ec8a9e06cf05 mq-safety: don't apply safety on non-outgoing changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15934
diff changeset
  3293
                    # pushed.
ec8a9e06cf05 mq-safety: don't apply safety on non-outgoing changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15934
diff changeset
  3294
                    heads = set(revs)
ec8a9e06cf05 mq-safety: don't apply safety on non-outgoing changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15934
diff changeset
  3295
                    for node in reversed(outapplied):
ec8a9e06cf05 mq-safety: don't apply safety on non-outgoing changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15934
diff changeset
  3296
                        if node in heads:
ec8a9e06cf05 mq-safety: don't apply safety on non-outgoing changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15934
diff changeset
  3297
                            break
ec8a9e06cf05 mq-safety: don't apply safety on non-outgoing changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15934
diff changeset
  3298
                        else:
ec8a9e06cf05 mq-safety: don't apply safety on non-outgoing changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15934
diff changeset
  3299
                            outapplied.pop()
ec8a9e06cf05 mq-safety: don't apply safety on non-outgoing changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15934
diff changeset
  3300
                # looking for pushed and shared changeset
ec8a9e06cf05 mq-safety: don't apply safety on non-outgoing changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15934
diff changeset
  3301
                for node in outapplied:
17954
4dc438ddd246 mq: don't refer to a random name-captured repo object
Bryan O'Sullivan <bryano@fb.com>
parents: 17922
diff changeset
  3302
                    if self[node].phase() < phases.secret:
15952
ec8a9e06cf05 mq-safety: don't apply safety on non-outgoing changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15934
diff changeset
  3303
                        raise util.Abort(_('source has mq patches applied'))
ec8a9e06cf05 mq-safety: don't apply safety on non-outgoing changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15934
diff changeset
  3304
                # no non-secret patches pushed
13327
dc11e30b48a3 mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents: 13256
diff changeset
  3305
            super(mqrepo, self).checkpush(force, revs)
3223
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3186
diff changeset
  3306
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9111
diff changeset
  3307
        def _findtags(self):
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9111
diff changeset
  3308
            '''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
  3309
            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
  3310
2724
9c41ae1908c7 mq: replace module-wide repo hash with a repo attribute
Brendan Cully <brendan@kublai.com>
parents: 2723
diff changeset
  3311
            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
  3312
            if not q.applied:
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9111
diff changeset
  3313
                return result
2663
96950d39171d Mq: modify repo.lookup to resolve applied patches too.
Brendan Cully <brendan@kublai.com>
parents: 2554
diff changeset
  3314
10678
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10663
diff changeset
  3315
            mqtags = [(patch.node, 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
  3316
13508
0396ca8015be mq: fix qpush recursion in _findtags when status file is wrong (issue2664)
Matt Mackall <mpm@selenic.com>
parents: 13507
diff changeset
  3317
            try:
18011
4908197d7422 clfilter: mq should not warn about filtered mq patches
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18010
diff changeset
  3318
                # for now ignore filtering business
4908197d7422 clfilter: mq should not warn about filtered mq patches
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18010
diff changeset
  3319
                self.unfiltered().changelog.rev(mqtags[-1][0])
14600
17c16bcf6926 mq: catch correct exception when calling changelog.rev()
Idan Kamara <idankk86@gmail.com>
parents: 14596
diff changeset
  3320
            except error.LookupError:
6960
46da38eef1b0 i18n: mark strings for translation in mq extension
Martin Geisler <mg@daimi.au.dk>
parents: 6940
diff changeset
  3321
                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
  3322
                             % short(mqtags[-1][0]))
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9111
diff changeset
  3323
                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
  3324
18662
c5f7e83d47cd mq: comply with filtering when injecting fake tags (issue3812)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18644
diff changeset
  3325
            # do not add fake tags for filtered revisions
c5f7e83d47cd mq: comply with filtering when injecting fake tags (issue3812)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18644
diff changeset
  3326
            included = self.changelog.hasnode
c5f7e83d47cd mq: comply with filtering when injecting fake tags (issue3812)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18644
diff changeset
  3327
            mqtags = [mqt for mqt in mqtags if included(mqt[0])]
c5f7e83d47cd mq: comply with filtering when injecting fake tags (issue3812)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18644
diff changeset
  3328
            if not mqtags:
c5f7e83d47cd mq: comply with filtering when injecting fake tags (issue3812)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18644
diff changeset
  3329
                return result
c5f7e83d47cd mq: comply with filtering when injecting fake tags (issue3812)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18644
diff changeset
  3330
2723
04d9b31faeca mq: do not hold a reference to repo in tags override
Brendan Cully <brendan@kublai.com>
parents: 2720
diff changeset
  3331
            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
  3332
            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
  3333
            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
  3334
            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
  3335
            for patch in mqtags:
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9111
diff changeset
  3336
                if patch[1] in tags:
16929
4b02d7006169 mq: lowercase warning messages
Martin Geisler <mg@aragost.com>
parents: 16867
diff changeset
  3337
                    self.ui.warn(_('tag %s overrides mq patch of the same '
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16657
diff changeset
  3338
                                   'name\n') % patch[1])
2723
04d9b31faeca mq: do not hold a reference to repo in tags override
Brendan Cully <brendan@kublai.com>
parents: 2720
diff changeset
  3339
                else:
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9111
diff changeset
  3340
                    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
  3341
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9111
diff changeset
  3342
            return result
2664
9b8df8dceeed Add qtip and qbase to mq qlookup.
Brendan Cully <brendan@kublai.com>
parents: 2663
diff changeset
  3343
2851
82f50658c72b mq: only add mq attribute to local repo
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2850
diff changeset
  3344
    if repo.local():
82f50658c72b mq: only add mq attribute to local repo
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2850
diff changeset
  3345
        repo.__class__ = mqrepo
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
  3346
15928
3a51eb88046a mq: ensure mq changesets are set to secret when no phase data are found
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15927
diff changeset
  3347
        repo._phasedefaults.append(mqphasedefaults)
3a51eb88046a mq: ensure mq changesets are set to secret when no phase data are found
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15927
diff changeset
  3348
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
  3349
def mqimport(orig, ui, repo, *args, **kwargs):
16416
c3aedd526d53 mq: replace hasattr() with util.safehasattr(), update check-code.py
Patrick Mezard <patrick@mezard.eu>
parents: 16303
diff changeset
  3350
    if (util.safehasattr(repo, 'abortifwdirpatched')
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10276
diff changeset
  3351
        and not kwargs.get('no_commit', False)):
14596
6a0070d00bc8 mq: rename abort_if_wdir_patched to abortifwdirpatched
Adrian Buehlmann <adrian@cadifra.com>
parents: 14595
diff changeset
  3352
        repo.abortifwdirpatched(_('cannot import over an applied patch'),
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
  3353
                                   kwargs.get('force'))
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
  3354
    return orig(ui, repo, *args, **kwargs)
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
  3355
10402
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  3356
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
  3357
    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
  3358
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  3359
    if not mq:
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  3360
        return orig(ui, *args, **kwargs)
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  3361
10691
a778a367c20b mq: fix init with nonexistent or non-local repository
Cédric Duval <cedricduval@free.fr>
parents: 10690
diff changeset
  3362
    if args:
a778a367c20b mq: fix init with nonexistent or non-local repository
Cédric Duval <cedricduval@free.fr>
parents: 10690
diff changeset
  3363
        repopath = args[0]
a778a367c20b mq: fix init with nonexistent or non-local repository
Cédric Duval <cedricduval@free.fr>
parents: 10690
diff changeset
  3364
        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
  3365
            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
  3366
                               'may be initialized'))
a778a367c20b mq: fix init with nonexistent or non-local repository
Cédric Duval <cedricduval@free.fr>
parents: 10690
diff changeset
  3367
    else:
a778a367c20b mq: fix init with nonexistent or non-local repository
Cédric Duval <cedricduval@free.fr>
parents: 10690
diff changeset
  3368
        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
  3369
        if not repopath:
12067
a4fbbe0fbc38 Lowercase error messages
Martin Geisler <mg@lazybytes.net>
parents: 11965
diff changeset
  3370
            raise util.Abort(_('there is no Mercurial repository here '
10691
a778a367c20b mq: fix init with nonexistent or non-local repository
Cédric Duval <cedricduval@free.fr>
parents: 10690
diff changeset
  3371
                               '(.hg not found)'))
10402
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  3372
    repo = hg.repository(ui, repopath)
10480
3076b39d7f3e mq: unify implementation of qinit and init -Q
Brendan Cully <brendan@kublai.com>
parents: 10476
diff changeset
  3373
    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
  3374
10359
ec02cf8d1628 mq: add --mq option to some commands
Brendan Cully <brendan@kublai.com>
parents: 10282
diff changeset
  3375
def mqcommand(orig, ui, repo, *args, **kwargs):
ec02cf8d1628 mq: add --mq option to some commands
Brendan Cully <brendan@kublai.com>
parents: 10282
diff changeset
  3376
    """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
  3377
ec02cf8d1628 mq: add --mq option to some commands
Brendan Cully <brendan@kublai.com>
parents: 10282
diff changeset
  3378
    # 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
  3379
    mq = kwargs.pop('mq', None)
10359
ec02cf8d1628 mq: add --mq option to some commands
Brendan Cully <brendan@kublai.com>
parents: 10282
diff changeset
  3380
ec02cf8d1628 mq: add --mq option to some commands
Brendan Cully <brendan@kublai.com>
parents: 10282
diff changeset
  3381
    if not mq:
ec02cf8d1628 mq: add --mq option to some commands
Brendan Cully <brendan@kublai.com>
parents: 10282
diff changeset
  3382
        return orig(ui, repo, *args, **kwargs)
ec02cf8d1628 mq: add --mq option to some commands
Brendan Cully <brendan@kublai.com>
parents: 10282
diff changeset
  3383
ec02cf8d1628 mq: add --mq option to some commands
Brendan Cully <brendan@kublai.com>
parents: 10282
diff changeset
  3384
    q = repo.mq
ec02cf8d1628 mq: add --mq option to some commands
Brendan Cully <brendan@kublai.com>
parents: 10282
diff changeset
  3385
    r = q.qrepo()
ec02cf8d1628 mq: add --mq option to some commands
Brendan Cully <brendan@kublai.com>
parents: 10282
diff changeset
  3386
    if not r:
11120
0bedcbcb3ae2 mq: mark error message for translation
Martin Geisler <mg@lazybytes.net>
parents: 11119
diff changeset
  3387
        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
  3388
    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
  3389
19212
d0ba7022c13b mq: switch to new summary hook mechanism
Bryan O'Sullivan <bryano@fb.com>
parents: 19064
diff changeset
  3390
def summaryhook(ui, repo):
11107
9c72c5c094aa mq: add a line to hg summary
Matt Mackall <mpm@selenic.com>
parents: 11078
diff changeset
  3391
    q = repo.mq
9c72c5c094aa mq: add a line to hg summary
Matt Mackall <mpm@selenic.com>
parents: 11078
diff changeset
  3392
    m = []
9c72c5c094aa mq: add a line to hg summary
Matt Mackall <mpm@selenic.com>
parents: 11078
diff changeset
  3393
    a, u = len(q.applied), len(q.unapplied(repo))
9c72c5c094aa mq: add a line to hg summary
Matt Mackall <mpm@selenic.com>
parents: 11078
diff changeset
  3394
    if a:
11121
d061ef1d781c mq: make use of output labeling for summary
Eric Eisner <ede@mit.edu>
parents: 11120
diff changeset
  3395
        m.append(ui.label(_("%d applied"), 'qseries.applied') % a)
11107
9c72c5c094aa mq: add a line to hg summary
Matt Mackall <mpm@selenic.com>
parents: 11078
diff changeset
  3396
    if u:
11121
d061ef1d781c mq: make use of output labeling for summary
Eric Eisner <ede@mit.edu>
parents: 11120
diff changeset
  3397
        m.append(ui.label(_("%d unapplied"), 'qseries.unapplied') % u)
11107
9c72c5c094aa mq: add a line to hg summary
Matt Mackall <mpm@selenic.com>
parents: 11078
diff changeset
  3398
    if m:
17893
4d1da97aa7e7 i18n: make column positioning message of MQ summary output translatable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17892
diff changeset
  3399
        # i18n: column positioning for "hg summary"
4d1da97aa7e7 i18n: make column positioning message of MQ summary output translatable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17892
diff changeset
  3400
        ui.write(_("mq:     %s\n") % ', '.join(m))
11107
9c72c5c094aa mq: add a line to hg summary
Matt Mackall <mpm@selenic.com>
parents: 11078
diff changeset
  3401
    else:
17892
ba0a1701c81a i18n: add "i18n" comment to column positioning messages of "hg summary"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17888
diff changeset
  3402
        # i18n: column positioning for "hg summary"
11119
2e270443a2c6 mq: mark string for translation
Martin Geisler <mg@lazybytes.net>
parents: 11107
diff changeset
  3403
        ui.note(_("mq:     (empty queue)\n"))
11107
9c72c5c094aa mq: add a line to hg summary
Matt Mackall <mpm@selenic.com>
parents: 11078
diff changeset
  3404
14210
68ade2a6b30a mq: add a 'mq()' revset predicate that returns applied mq csets
Idan Kamara <idankk86@gmail.com>
parents: 14191
diff changeset
  3405
def revsetmq(repo, subset, x):
68ade2a6b30a mq: add a 'mq()' revset predicate that returns applied mq csets
Idan Kamara <idankk86@gmail.com>
parents: 14191
diff changeset
  3406
    """``mq()``
68ade2a6b30a mq: add a 'mq()' revset predicate that returns applied mq csets
Idan Kamara <idankk86@gmail.com>
parents: 14191
diff changeset
  3407
    Changesets managed by MQ.
68ade2a6b30a mq: add a 'mq()' revset predicate that returns applied mq csets
Idan Kamara <idankk86@gmail.com>
parents: 14191
diff changeset
  3408
    """
68ade2a6b30a mq: add a 'mq()' revset predicate that returns applied mq csets
Idan Kamara <idankk86@gmail.com>
parents: 14191
diff changeset
  3409
    revset.getargs(x, 0, 0, _("mq takes no arguments"))
68ade2a6b30a mq: add a 'mq()' revset predicate that returns applied mq csets
Idan Kamara <idankk86@gmail.com>
parents: 14191
diff changeset
  3410
    applied = set([repo[r.node].rev() for r in repo.mq.applied])
68ade2a6b30a mq: add a 'mq()' revset predicate that returns applied mq csets
Idan Kamara <idankk86@gmail.com>
parents: 14191
diff changeset
  3411
    return [r for r in subset if r in applied]
68ade2a6b30a mq: add a 'mq()' revset predicate that returns applied mq csets
Idan Kamara <idankk86@gmail.com>
parents: 14191
diff changeset
  3412
68ade2a6b30a mq: add a 'mq()' revset predicate that returns applied mq csets
Idan Kamara <idankk86@gmail.com>
parents: 14191
diff changeset
  3413
# tell hggettext to extract docstrings from these functions:
68ade2a6b30a mq: add a 'mq()' revset predicate that returns applied mq csets
Idan Kamara <idankk86@gmail.com>
parents: 14191
diff changeset
  3414
i18nfunctions = [revsetmq]
68ade2a6b30a mq: add a 'mq()' revset predicate that returns applied mq csets
Idan Kamara <idankk86@gmail.com>
parents: 14191
diff changeset
  3415
17101
6bc275593d07 mq: defer command wrapping to extsetup (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 17059
diff changeset
  3416
def extsetup(ui):
6bc275593d07 mq: defer command wrapping to extsetup (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 17059
diff changeset
  3417
    # Ensure mq wrappers are called first, regardless of extension load order by
6bc275593d07 mq: defer command wrapping to extsetup (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 17059
diff changeset
  3418
    # NOT wrapping in uisetup() and instead deferring to init stage two here.
10591
ff2704a8ded3 mq: drop -Q in favor of --mq only
Matt Mackall <mpm@selenic.com>
parents: 10589
diff changeset
  3419
    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
  3420
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
  3421
    extensions.wrapcommand(commands.table, 'import', mqimport)
19212
d0ba7022c13b mq: switch to new summary hook mechanism
Bryan O'Sullivan <bryano@fb.com>
parents: 19064
diff changeset
  3422
    cmdutil.summaryhooks.add('mq', summaryhook)
10402
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  3423
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  3424
    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
  3425
    entry[1].extend(mqopt)
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
  3426
14448
7d367e8f892d mq: allow --mq for qrecord
Idan Kamara <idankk86@gmail.com>
parents: 14435
diff changeset
  3427
    nowrap = set(commands.norepo.split(" "))
12036
31f02288bbc4 mq: extend support for the --mq argument to extension commands
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11970
diff changeset
  3428
31f02288bbc4 mq: extend support for the --mq argument to extension commands
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11970
diff changeset
  3429
    def dotable(cmdtable):
31f02288bbc4 mq: extend support for the --mq argument to extension commands
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11970
diff changeset
  3430
        for cmd in cmdtable.keys():
31f02288bbc4 mq: extend support for the --mq argument to extension commands
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11970
diff changeset
  3431
            cmd = cmdutil.parsealiases(cmd)[0]
31f02288bbc4 mq: extend support for the --mq argument to extension commands
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11970
diff changeset
  3432
            if cmd in nowrap:
31f02288bbc4 mq: extend support for the --mq argument to extension commands
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11970
diff changeset
  3433
                continue
31f02288bbc4 mq: extend support for the --mq argument to extension commands
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11970
diff changeset
  3434
            entry = extensions.wrapcommand(cmdtable, cmd, mqcommand)
31f02288bbc4 mq: extend support for the --mq argument to extension commands
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11970
diff changeset
  3435
            entry[1].extend(mqopt)
31f02288bbc4 mq: extend support for the --mq argument to extension commands
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11970
diff changeset
  3436
31f02288bbc4 mq: extend support for the --mq argument to extension commands
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11970
diff changeset
  3437
    dotable(commands.table)
31f02288bbc4 mq: extend support for the --mq argument to extension commands
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11970
diff changeset
  3438
31f02288bbc4 mq: extend support for the --mq argument to extension commands
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11970
diff changeset
  3439
    for extname, extmodule in extensions.extensions():
31f02288bbc4 mq: extend support for the --mq argument to extension commands
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11970
diff changeset
  3440
        if extmodule.__file__ != __file__:
31f02288bbc4 mq: extend support for the --mq argument to extension commands
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11970
diff changeset
  3441
            dotable(getattr(extmodule, 'cmdtable', {}))
7142
88f1b8081f1c Prevent import over an applied patch (closes issue795)
Brendan Cully <brendan@kublai.com>
parents: 7113
diff changeset
  3442
17101
6bc275593d07 mq: defer command wrapping to extsetup (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 17059
diff changeset
  3443
    revset.symbols['mq'] = revsetmq
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10824
diff changeset
  3444
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10824
diff changeset
  3445
colortable = {'qguard.negative': 'red',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10824
diff changeset
  3446
              'qguard.positive': 'yellow',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10824
diff changeset
  3447
              'qguard.unguarded': 'green',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10824
diff changeset
  3448
              'qseries.applied': 'blue bold underline',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10824
diff changeset
  3449
              'qseries.guarded': 'black bold',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10824
diff changeset
  3450
              'qseries.missing': 'red bold',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10824
diff changeset
  3451
              'qseries.unapplied': 'black bold'}
17773
434e5bd615fc commands: don't infer repo for commands like update (issue2748)
Siddharth Agarwal <sid0@fb.com>
parents: 17730
diff changeset
  3452
434e5bd615fc commands: don't infer repo for commands like update (issue2748)
Siddharth Agarwal <sid0@fb.com>
parents: 17730
diff changeset
  3453
commands.inferrepo += " qnew qrefresh qdiff qcommit"