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