annotate hgext/mq.py @ 2873:4ec58b157265

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