annotate hgext/record.py @ 24261:20aac24e2114

record: move header class from record to patch Part of a series of patches to move record from hgext to core
author Laurent Charignon <lcharignon@fb.com>
date Mon, 09 Mar 2015 13:04:50 -0700
parents 60c279ab7bd3
children 7f24b2a0581a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
1 # record.py
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
2 #
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
3 # Copyright 2007 Bryan O'Sullivan <bos@serpentine.com>
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
4 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8208
diff changeset
5 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9837
diff changeset
6 # GNU General Public License version 2 or any later version.
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
7
8934
9dda4c73fc3b extensions: change descriptions for extensions providing a few commands
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8894
diff changeset
8 '''commands to interactively select changes for commit/qrefresh'''
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
9
20266
061766323061 record: use "ui.extractchoices()" to get the list of available responses
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20171
diff changeset
10 from mercurial.i18n import _
18287
eeadc76a7575 record: remove unused import
Idan Kamara <idankk86@gmail.com>
parents: 18266
diff changeset
11 from mercurial import cmdutil, commands, extensions, hg, patch
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
12 from mercurial import util
13099
a08b49d2f116 record: move copystat() hack out of util.copyfile() and into record
Brodie Rao <brodie@bitheap.org>
parents: 13075
diff changeset
13 import copy, cStringIO, errno, os, re, shutil, tempfile
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
14
14408
054da1e0afbe record: use cmdutil.command decorator
Idan Kamara <idankk86@gmail.com>
parents: 14407
diff changeset
15 cmdtable = {}
054da1e0afbe record: use cmdutil.command decorator
Idan Kamara <idankk86@gmail.com>
parents: 14407
diff changeset
16 command = cmdutil.command(cmdtable)
16743
38caf405d010 hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents: 16683
diff changeset
17 testedwith = 'internal'
14408
054da1e0afbe record: use cmdutil.command decorator
Idan Kamara <idankk86@gmail.com>
parents: 14407
diff changeset
18
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
19 lines_re = re.compile(r'@@ -(\d+),(\d+) \+(\d+),(\d+) @@\s*(.*)')
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
20
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
21 def scanpatch(fp):
5826
cc43d9f36ff2 record: some docs
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5751
diff changeset
22 """like patch.iterhunks, but yield different events
cc43d9f36ff2 record: some docs
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5751
diff changeset
23
cc43d9f36ff2 record: some docs
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5751
diff changeset
24 - ('file', [header_lines + fromfile + tofile])
cc43d9f36ff2 record: some docs
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5751
diff changeset
25 - ('context', [context_lines])
cc43d9f36ff2 record: some docs
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5751
diff changeset
26 - ('hunk', [hunk_lines])
17425
e95ec38f86b0 fix wording and not-completely-trivial spelling errors and bad docstrings
Mads Kiilerich <mads@kiilerich.com>
parents: 17424
diff changeset
27 - ('range', (-start,len, +start,len, proc))
5826
cc43d9f36ff2 record: some docs
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5751
diff changeset
28 """
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
29 lr = patch.linereader(fp)
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
30
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
31 def scanwhile(first, p):
5826
cc43d9f36ff2 record: some docs
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5751
diff changeset
32 """scan lr while predicate holds"""
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
33 lines = [first]
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
34 while True:
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
35 line = lr.readline()
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
36 if not line:
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
37 break
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
38 if p(line):
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
39 lines.append(line)
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
40 else:
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
41 lr.push(line)
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
42 break
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
43 return lines
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
44
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
45 while True:
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
46 line = lr.readline()
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
47 if not line:
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
48 break
13157
82f840109f76 record: teach parsepatch() about non-git style headers
Steve Borho <steve@borho.org>
parents: 13099
diff changeset
49 if line.startswith('diff --git a/') or line.startswith('diff -r '):
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
50 def notheader(line):
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
51 s = line.split(None, 1)
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
52 return not s or s[0] not in ('---', 'diff')
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
53 header = scanwhile(line, notheader)
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
54 fromfile = lr.readline()
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
55 if fromfile.startswith('---'):
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
56 tofile = lr.readline()
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
57 header += [fromfile, tofile]
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
58 else:
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
59 lr.push(fromfile)
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
60 yield 'file', header
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
61 elif line[0] == ' ':
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
62 yield 'context', scanwhile(line, lambda l: l[0] in ' \\')
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
63 elif line[0] in '-+':
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
64 yield 'hunk', scanwhile(line, lambda l: l[0] in '-+\\')
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
65 else:
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
66 m = lines_re.match(line)
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
67 if m:
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
68 yield 'range', m.groups()
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
69 else:
18954
b1639e98e8a1 record: ignore trailing content when parsing patches - introduce 'other' lines
Mads Kiilerich <mads@kiilerich.com>
parents: 18953
diff changeset
70 yield 'other', line
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
71
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
72 def countchanges(hunk):
5826
cc43d9f36ff2 record: some docs
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5751
diff changeset
73 """hunk -> (n+,n-)"""
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
74 add = len([h for h in hunk if h[0] == '+'])
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
75 rem = len([h for h in hunk if h[0] == '-'])
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
76 return add, rem
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
77
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
78 class hunk(object):
5826
cc43d9f36ff2 record: some docs
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5751
diff changeset
79 """patch hunk
6210
942287cb1f57 Removed trailing spaces from everything except test output
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6163
diff changeset
80
5826
cc43d9f36ff2 record: some docs
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5751
diff changeset
81 XXX shouldn't we merge this with patch.hunk ?
cc43d9f36ff2 record: some docs
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5751
diff changeset
82 """
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
83 maxcontext = 3
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
84
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
85 def __init__(self, header, fromline, toline, proc, before, hunk, after):
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
86 def trimcontext(number, lines):
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
87 delta = len(lines) - self.maxcontext
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
88 if False and delta > 0:
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
89 return number + delta, lines[:self.maxcontext]
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
90 return number, lines
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
91
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
92 self.header = header
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
93 self.fromline, self.before = trimcontext(fromline, before)
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
94 self.toline, self.after = trimcontext(toline, after)
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
95 self.proc = proc
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
96 self.hunk = hunk
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
97 self.added, self.removed = countchanges(self.hunk)
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
98
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
99 def write(self, fp):
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
100 delta = len(self.before) + len(self.after)
6949
834f7e069cae record: take diff lines for lack of trailing newlines into account (issue1282)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6212
diff changeset
101 if self.after and self.after[-1] == '\\ No newline at end of file\n':
834f7e069cae record: take diff lines for lack of trailing newlines into account (issue1282)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6212
diff changeset
102 delta -= 1
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
103 fromlen = delta + self.removed
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
104 tolen = delta + self.added
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
105 fp.write('@@ -%d,%d +%d,%d @@%s\n' %
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
106 (self.fromline, fromlen, self.toline, tolen,
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
107 self.proc and (' ' + self.proc)))
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
108 fp.write(''.join(self.before + self.hunk + self.after))
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
109
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
110 pretty = write
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
111
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
112 def filename(self):
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
113 return self.header.filename()
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
114
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
115 def __repr__(self):
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
116 return '<hunk %r@%d>' % (self.filename(), self.fromline)
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
117
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
118 def parsepatch(fp):
13293
ad1b46e4a575 record: refactor the prompt loop
Patrick Mezard <pmezard@gmail.com>
parents: 13291
diff changeset
119 """patch -> [] of headers -> [] of hunks """
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
120 class parser(object):
5826
cc43d9f36ff2 record: some docs
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5751
diff changeset
121 """patch parsing state machine"""
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
122 def __init__(self):
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
123 self.fromline = 0
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
124 self.toline = 0
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
125 self.proc = ''
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
126 self.header = None
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
127 self.context = []
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
128 self.before = []
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
129 self.hunk = []
13293
ad1b46e4a575 record: refactor the prompt loop
Patrick Mezard <pmezard@gmail.com>
parents: 13291
diff changeset
130 self.headers = []
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
131
11499
324cd681fa47 record: tuple parameter unpacking is deprecated in py3k
Renato Cunha <renatoc@gmail.com>
parents: 11238
diff changeset
132 def addrange(self, limits):
324cd681fa47 record: tuple parameter unpacking is deprecated in py3k
Renato Cunha <renatoc@gmail.com>
parents: 11238
diff changeset
133 fromstart, fromend, tostart, toend, proc = limits
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
134 self.fromline = int(fromstart)
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
135 self.toline = int(tostart)
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
136 self.proc = proc
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
137
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
138 def addcontext(self, context):
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
139 if self.hunk:
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
140 h = hunk(self.header, self.fromline, self.toline, self.proc,
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
141 self.before, self.hunk, context)
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
142 self.header.hunks.append(h)
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
143 self.fromline += len(self.before) + h.removed
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
144 self.toline += len(self.before) + h.added
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
145 self.before = []
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
146 self.hunk = []
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
147 self.proc = ''
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
148 self.context = context
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
149
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
150 def addhunk(self, hunk):
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
151 if self.context:
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
152 self.before = self.context
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
153 self.context = []
6949
834f7e069cae record: take diff lines for lack of trailing newlines into account (issue1282)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6212
diff changeset
154 self.hunk = hunk
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
155
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
156 def newfile(self, hdr):
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
157 self.addcontext([])
24261
20aac24e2114 record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents: 24254
diff changeset
158 h = patch.header(hdr)
13293
ad1b46e4a575 record: refactor the prompt loop
Patrick Mezard <pmezard@gmail.com>
parents: 13291
diff changeset
159 self.headers.append(h)
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
160 self.header = h
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
161
18954
b1639e98e8a1 record: ignore trailing content when parsing patches - introduce 'other' lines
Mads Kiilerich <mads@kiilerich.com>
parents: 18953
diff changeset
162 def addother(self, line):
b1639e98e8a1 record: ignore trailing content when parsing patches - introduce 'other' lines
Mads Kiilerich <mads@kiilerich.com>
parents: 18953
diff changeset
163 pass # 'other' lines are ignored
b1639e98e8a1 record: ignore trailing content when parsing patches - introduce 'other' lines
Mads Kiilerich <mads@kiilerich.com>
parents: 18953
diff changeset
164
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
165 def finished(self):
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
166 self.addcontext([])
13293
ad1b46e4a575 record: refactor the prompt loop
Patrick Mezard <pmezard@gmail.com>
parents: 13291
diff changeset
167 return self.headers
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
168
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
169 transitions = {
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
170 'file': {'context': addcontext,
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
171 'file': newfile,
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
172 'hunk': addhunk,
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
173 'range': addrange},
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
174 'context': {'file': newfile,
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
175 'hunk': addhunk,
18954
b1639e98e8a1 record: ignore trailing content when parsing patches - introduce 'other' lines
Mads Kiilerich <mads@kiilerich.com>
parents: 18953
diff changeset
176 'range': addrange,
b1639e98e8a1 record: ignore trailing content when parsing patches - introduce 'other' lines
Mads Kiilerich <mads@kiilerich.com>
parents: 18953
diff changeset
177 'other': addother},
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
178 'hunk': {'context': addcontext,
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
179 'file': newfile,
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
180 'range': addrange},
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
181 'range': {'context': addcontext,
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
182 'hunk': addhunk},
18954
b1639e98e8a1 record: ignore trailing content when parsing patches - introduce 'other' lines
Mads Kiilerich <mads@kiilerich.com>
parents: 18953
diff changeset
183 'other': {'other': addother},
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
184 }
5143
d4fa6bafc43a Remove trailing spaces, fix indentation
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5129
diff changeset
185
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
186 p = parser()
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
187
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
188 state = 'context'
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
189 for newstate, data in scanpatch(fp):
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
190 try:
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
191 p.transitions[state][newstate](p, data)
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
192 except KeyError:
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
193 raise patch.PatchError('unhandled transition: %s -> %s' %
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
194 (state, newstate))
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
195 state = newstate
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
196 return p.finished()
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
197
13293
ad1b46e4a575 record: refactor the prompt loop
Patrick Mezard <pmezard@gmail.com>
parents: 13291
diff changeset
198 def filterpatch(ui, headers):
5826
cc43d9f36ff2 record: some docs
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5751
diff changeset
199 """Interactively filter patch chunks into applied-only chunks"""
cc43d9f36ff2 record: some docs
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5751
diff changeset
200
16324
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
201 def prompt(skipfile, skipall, query, chunk):
5826
cc43d9f36ff2 record: some docs
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5751
diff changeset
202 """prompt query, and process base inputs
6210
942287cb1f57 Removed trailing spaces from everything except test output
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6163
diff changeset
203
5826
cc43d9f36ff2 record: some docs
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5751
diff changeset
204 - y/n for the rest of file
cc43d9f36ff2 record: some docs
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5751
diff changeset
205 - y/n for the rest
cc43d9f36ff2 record: some docs
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5751
diff changeset
206 - ? (help)
cc43d9f36ff2 record: some docs
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5751
diff changeset
207 - q (quit)
cc43d9f36ff2 record: some docs
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5751
diff changeset
208
13291
90e7be23167e record: turn prompt() into a pure function
Patrick Mezard <pmezard@gmail.com>
parents: 13290
diff changeset
209 Return True/False and possibly updated skipfile and skipall.
5826
cc43d9f36ff2 record: some docs
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5751
diff changeset
210 """
16324
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
211 newpatches = None
13291
90e7be23167e record: turn prompt() into a pure function
Patrick Mezard <pmezard@gmail.com>
parents: 13290
diff changeset
212 if skipall is not None:
16324
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
213 return skipall, skipfile, skipall, newpatches
13291
90e7be23167e record: turn prompt() into a pure function
Patrick Mezard <pmezard@gmail.com>
parents: 13290
diff changeset
214 if skipfile is not None:
16324
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
215 return skipfile, skipfile, skipall, newpatches
5154
67afecb8d6cc record: improve docs, improve prompts
Bryan O'Sullivan <bos@serpentine.com>
parents: 5147
diff changeset
216 while True:
19226
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 18954
diff changeset
217 resps = _('[Ynesfdaq?]'
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 18954
diff changeset
218 '$$ &Yes, record this change'
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 18954
diff changeset
219 '$$ &No, skip this change'
20266
061766323061 record: use "ui.extractchoices()" to get the list of available responses
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20171
diff changeset
220 '$$ &Edit this change manually'
19226
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 18954
diff changeset
221 '$$ &Skip remaining changes to this file'
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 18954
diff changeset
222 '$$ Record remaining changes to this &file'
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 18954
diff changeset
223 '$$ &Done, skip remaining changes and files'
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 18954
diff changeset
224 '$$ Record &all changes to all remaining files'
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 18954
diff changeset
225 '$$ &Quit, recording no changes'
20266
061766323061 record: use "ui.extractchoices()" to get the list of available responses
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20171
diff changeset
226 '$$ &? (display help)')
19226
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 18954
diff changeset
227 r = ui.promptchoice("%s %s" % (query, resps))
10694
d7732d2df54a record: separate each hunk with a blank line
Martin Geisler <mg@lazybytes.net>
parents: 10323
diff changeset
228 ui.write("\n")
16324
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
229 if r == 8: # ?
20266
061766323061 record: use "ui.extractchoices()" to get the list of available responses
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20171
diff changeset
230 for c, t in ui.extractchoices(resps)[1]:
061766323061 record: use "ui.extractchoices()" to get the list of available responses
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20171
diff changeset
231 ui.write('%s - %s\n' % (c, t.lower()))
5154
67afecb8d6cc record: improve docs, improve prompts
Bryan O'Sullivan <bos@serpentine.com>
parents: 5147
diff changeset
232 continue
9048
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8934
diff changeset
233 elif r == 0: # yes
9837
b13474cd1496 record: handle translated prompt correctly
Martin Geisler <mg@lazybytes.net>
parents: 9710
diff changeset
234 ret = True
9048
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8934
diff changeset
235 elif r == 1: # no
9837
b13474cd1496 record: handle translated prompt correctly
Martin Geisler <mg@lazybytes.net>
parents: 9710
diff changeset
236 ret = False
16324
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
237 elif r == 2: # Edit patch
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
238 if chunk is None:
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
239 ui.write(_('cannot edit patch for whole file'))
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
240 ui.write("\n")
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
241 continue
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
242 if chunk.header.binary():
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
243 ui.write(_('cannot edit patch for binary file'))
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
244 ui.write("\n")
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
245 continue
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
246 # Patch comment based on the Git one (based on comment at end of
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
247 # http://mercurial.selenic.com/wiki/RecordExtension)
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
248 phelp = '---' + _("""
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
249 To remove '-' lines, make them ' ' lines (context).
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
250 To remove '+' lines, delete them.
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
251 Lines starting with # will be removed from the patch.
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
252
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
253 If the patch applies cleanly, the edited hunk will immediately be
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
254 added to the record list. If it does not apply cleanly, a rejects
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
255 file will be generated: you can use that when you try again. If
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
256 all lines of the hunk are removed, then the edit is aborted and
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
257 the hunk is left unchanged.
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
258 """)
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
259 (patchfd, patchfn) = tempfile.mkstemp(prefix="hg-editor-",
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
260 suffix=".diff", text=True)
16328
d388c3fc8319 record: fix up test issues
Matt Mackall <mpm@selenic.com>
parents: 16324
diff changeset
261 ncpatchfp = None
16324
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
262 try:
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
263 # Write the initial patch
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
264 f = os.fdopen(patchfd, "w")
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
265 chunk.header.write(f)
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
266 chunk.write(f)
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
267 f.write('\n'.join(['# ' + i for i in phelp.splitlines()]))
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
268 f.close()
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
269 # Start the editor and wait for it to complete
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
270 editor = ui.geteditor()
23270
41c03b7592ed util.system: use ui.system() in place of optional ui.fout parameter
Yuya Nishihara <yuya@tcha.org>
parents: 22921
diff changeset
271 ui.system("%s \"%s\"" % (editor, patchfn),
41c03b7592ed util.system: use ui.system() in place of optional ui.fout parameter
Yuya Nishihara <yuya@tcha.org>
parents: 22921
diff changeset
272 environ={'HGUSER': ui.username()},
41c03b7592ed util.system: use ui.system() in place of optional ui.fout parameter
Yuya Nishihara <yuya@tcha.org>
parents: 22921
diff changeset
273 onerr=util.Abort, errprefix=_("edit failed"))
16324
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
274 # Remove comment lines
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
275 patchfp = open(patchfn)
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
276 ncpatchfp = cStringIO.StringIO()
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
277 for line in patchfp:
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
278 if not line.startswith('#'):
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
279 ncpatchfp.write(line)
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
280 patchfp.close()
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
281 ncpatchfp.seek(0)
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
282 newpatches = parsepatch(ncpatchfp)
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
283 finally:
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
284 os.unlink(patchfn)
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
285 del ncpatchfp
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
286 # Signal that the chunk shouldn't be applied as-is, but
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
287 # provide the new patch to be used instead.
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
288 ret = False
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
289 elif r == 3: # Skip
13291
90e7be23167e record: turn prompt() into a pure function
Patrick Mezard <pmezard@gmail.com>
parents: 13290
diff changeset
290 ret = skipfile = False
16324
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
291 elif r == 4: # file (Record remaining)
13291
90e7be23167e record: turn prompt() into a pure function
Patrick Mezard <pmezard@gmail.com>
parents: 13290
diff changeset
292 ret = skipfile = True
16324
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
293 elif r == 5: # done, skip remaining
13291
90e7be23167e record: turn prompt() into a pure function
Patrick Mezard <pmezard@gmail.com>
parents: 13290
diff changeset
294 ret = skipall = False
16324
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
295 elif r == 6: # all
13291
90e7be23167e record: turn prompt() into a pure function
Patrick Mezard <pmezard@gmail.com>
parents: 13290
diff changeset
296 ret = skipall = True
16324
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
297 elif r == 7: # quit
5154
67afecb8d6cc record: improve docs, improve prompts
Bryan O'Sullivan <bos@serpentine.com>
parents: 5147
diff changeset
298 raise util.Abort(_('user quit'))
16324
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
299 return ret, skipfile, skipall, newpatches
13291
90e7be23167e record: turn prompt() into a pure function
Patrick Mezard <pmezard@gmail.com>
parents: 13290
diff changeset
300
90e7be23167e record: turn prompt() into a pure function
Patrick Mezard <pmezard@gmail.com>
parents: 13290
diff changeset
301 seen = set()
90e7be23167e record: turn prompt() into a pure function
Patrick Mezard <pmezard@gmail.com>
parents: 13290
diff changeset
302 applied = {} # 'filename' -> [] of chunks
90e7be23167e record: turn prompt() into a pure function
Patrick Mezard <pmezard@gmail.com>
parents: 13290
diff changeset
303 skipfile, skipall = None, None
13295
fb446228c0d4 record: do not include files into changes count
Patrick Mezard <pmezard@gmail.com>
parents: 13294
diff changeset
304 pos, total = 1, sum(len(h.hunks) for h in headers)
13293
ad1b46e4a575 record: refactor the prompt loop
Patrick Mezard <pmezard@gmail.com>
parents: 13291
diff changeset
305 for h in headers:
13295
fb446228c0d4 record: do not include files into changes count
Patrick Mezard <pmezard@gmail.com>
parents: 13294
diff changeset
306 pos += len(h.hunks)
13293
ad1b46e4a575 record: refactor the prompt loop
Patrick Mezard <pmezard@gmail.com>
parents: 13291
diff changeset
307 skipfile = None
ad1b46e4a575 record: refactor the prompt loop
Patrick Mezard <pmezard@gmail.com>
parents: 13291
diff changeset
308 fixoffset = 0
ad1b46e4a575 record: refactor the prompt loop
Patrick Mezard <pmezard@gmail.com>
parents: 13291
diff changeset
309 hdr = ''.join(h.header)
ad1b46e4a575 record: refactor the prompt loop
Patrick Mezard <pmezard@gmail.com>
parents: 13291
diff changeset
310 if hdr in seen:
ad1b46e4a575 record: refactor the prompt loop
Patrick Mezard <pmezard@gmail.com>
parents: 13291
diff changeset
311 continue
ad1b46e4a575 record: refactor the prompt loop
Patrick Mezard <pmezard@gmail.com>
parents: 13291
diff changeset
312 seen.add(hdr)
ad1b46e4a575 record: refactor the prompt loop
Patrick Mezard <pmezard@gmail.com>
parents: 13291
diff changeset
313 if skipall is None:
ad1b46e4a575 record: refactor the prompt loop
Patrick Mezard <pmezard@gmail.com>
parents: 13291
diff changeset
314 h.pretty(ui)
ad1b46e4a575 record: refactor the prompt loop
Patrick Mezard <pmezard@gmail.com>
parents: 13291
diff changeset
315 msg = (_('examine changes to %s?') %
17081
b013baa3898e record: fix display of non-ASCII names
Matt Mackall <mpm@selenic.com>
parents: 16328
diff changeset
316 _(' and ').join("'%s'" % f for f in h.files()))
16324
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
317 r, skipfile, skipall, np = prompt(skipfile, skipall, msg, None)
13293
ad1b46e4a575 record: refactor the prompt loop
Patrick Mezard <pmezard@gmail.com>
parents: 13291
diff changeset
318 if not r:
ad1b46e4a575 record: refactor the prompt loop
Patrick Mezard <pmezard@gmail.com>
parents: 13291
diff changeset
319 continue
ad1b46e4a575 record: refactor the prompt loop
Patrick Mezard <pmezard@gmail.com>
parents: 13291
diff changeset
320 applied[h.filename()] = [h]
ad1b46e4a575 record: refactor the prompt loop
Patrick Mezard <pmezard@gmail.com>
parents: 13291
diff changeset
321 if h.allhunks():
ad1b46e4a575 record: refactor the prompt loop
Patrick Mezard <pmezard@gmail.com>
parents: 13291
diff changeset
322 applied[h.filename()] += h.hunks
ad1b46e4a575 record: refactor the prompt loop
Patrick Mezard <pmezard@gmail.com>
parents: 13291
diff changeset
323 continue
ad1b46e4a575 record: refactor the prompt loop
Patrick Mezard <pmezard@gmail.com>
parents: 13291
diff changeset
324 for i, chunk in enumerate(h.hunks):
13291
90e7be23167e record: turn prompt() into a pure function
Patrick Mezard <pmezard@gmail.com>
parents: 13290
diff changeset
325 if skipfile is None and skipall is None:
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
326 chunk.pretty(ui)
13773
e5390a8b56db record: replace poor man's if-statement with real if-statement
Martin Geisler <mg@lazybytes.net>
parents: 13295
diff changeset
327 if total == 1:
17566
cd73bbc99bdc record: fix display of non-ASCII names in chunk selection
Nikolaj Sjujskij <sterkrig@myopera.com>
parents: 17446
diff changeset
328 msg = _("record this change to '%s'?") % chunk.filename()
13773
e5390a8b56db record: replace poor man's if-statement with real if-statement
Martin Geisler <mg@lazybytes.net>
parents: 13295
diff changeset
329 else:
e5390a8b56db record: replace poor man's if-statement with real if-statement
Martin Geisler <mg@lazybytes.net>
parents: 13295
diff changeset
330 idx = pos - len(h.hunks) + i
17566
cd73bbc99bdc record: fix display of non-ASCII names in chunk selection
Nikolaj Sjujskij <sterkrig@myopera.com>
parents: 17446
diff changeset
331 msg = _("record change %d/%d to '%s'?") % (idx, total,
cd73bbc99bdc record: fix display of non-ASCII names in chunk selection
Nikolaj Sjujskij <sterkrig@myopera.com>
parents: 17446
diff changeset
332 chunk.filename())
16324
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
333 r, skipfile, skipall, newpatches = prompt(skipfile,
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
334 skipall, msg, chunk)
9837
b13474cd1496 record: handle translated prompt correctly
Martin Geisler <mg@lazybytes.net>
parents: 9710
diff changeset
335 if r:
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
336 if fixoffset:
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
337 chunk = copy.copy(chunk)
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
338 chunk.toline += fixoffset
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
339 applied[chunk.filename()].append(chunk)
16324
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
340 elif newpatches is not None:
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
341 for newpatch in newpatches:
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
342 for newhunk in newpatch.hunks:
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
343 if fixoffset:
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
344 newhunk.toline += fixoffset
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
345 applied[newhunk.filename()].append(newhunk)
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
346 else:
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
347 fixoffset += chunk.removed - chunk.added
11500
b782a7eb9037 record: removed 'reduce' calls (unsupported by py3k)
Renato Cunha <renatoc@gmail.com>
parents: 11499
diff changeset
348 return sum([h for h in applied.itervalues()
b782a7eb9037 record: removed 'reduce' calls (unsupported by py3k)
Renato Cunha <renatoc@gmail.com>
parents: 11499
diff changeset
349 if h[0].special() or len(h) > 1], [])
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
350
14408
054da1e0afbe record: use cmdutil.command decorator
Idan Kamara <idankk86@gmail.com>
parents: 14407
diff changeset
351 @command("record",
14597
3f1dccea9510 record: add white space diff options
Ingo Proetel <proetel@aicas.de>
parents: 14441
diff changeset
352 # same options as commit + white space diff options
20300
0076643077a3 record: use commands.diffwsopts instead of ad-hoc diffopts
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 20266
diff changeset
353 commands.table['^commit|ci'][1][:] + commands.diffwsopts,
14408
054da1e0afbe record: use cmdutil.command decorator
Idan Kamara <idankk86@gmail.com>
parents: 14407
diff changeset
354 _('hg record [OPTION]... [FILE]...'))
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
355 def record(ui, repo, *pats, **opts):
5154
67afecb8d6cc record: improve docs, improve prompts
Bryan O'Sullivan <bos@serpentine.com>
parents: 5147
diff changeset
356 '''interactively select changes to commit
67afecb8d6cc record: improve docs, improve prompts
Bryan O'Sullivan <bos@serpentine.com>
parents: 5147
diff changeset
357
10973
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10890
diff changeset
358 If a list of files is omitted, all changes reported by :hg:`status`
9272
784899697571 record: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9157
diff changeset
359 will be candidates for recording.
5154
67afecb8d6cc record: improve docs, improve prompts
Bryan O'Sullivan <bos@serpentine.com>
parents: 5147
diff changeset
360
10973
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10890
diff changeset
361 See :hg:`help dates` for a list of formats valid for -d/--date.
6163
1f733c2f0165 Document log date ranges and mention 'hg help dates' for all commands (issue998)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5932
diff changeset
362
9272
784899697571 record: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9157
diff changeset
363 You will be prompted for whether to record changes to each
784899697571 record: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9157
diff changeset
364 modified file, and for files with multiple changes, for each
784899697571 record: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9157
diff changeset
365 change to use. For each query, the following responses are
784899697571 record: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9157
diff changeset
366 possible::
5154
67afecb8d6cc record: improve docs, improve prompts
Bryan O'Sullivan <bos@serpentine.com>
parents: 5147
diff changeset
367
9157
9261667e9b82 commands: use minirst parser when displaying help
Martin Geisler <mg@lazybytes.net>
parents: 9087
diff changeset
368 y - record this change
9261667e9b82 commands: use minirst parser when displaying help
Martin Geisler <mg@lazybytes.net>
parents: 9087
diff changeset
369 n - skip this change
16324
46b991a1f428 record: allow splitting of hunks by manually editing patches
A. S. Budden <abudden@gmail.com>
parents: 15184
diff changeset
370 e - edit this change manually
5154
67afecb8d6cc record: improve docs, improve prompts
Bryan O'Sullivan <bos@serpentine.com>
parents: 5147
diff changeset
371
9157
9261667e9b82 commands: use minirst parser when displaying help
Martin Geisler <mg@lazybytes.net>
parents: 9087
diff changeset
372 s - skip remaining changes to this file
9261667e9b82 commands: use minirst parser when displaying help
Martin Geisler <mg@lazybytes.net>
parents: 9087
diff changeset
373 f - record remaining changes to this file
5154
67afecb8d6cc record: improve docs, improve prompts
Bryan O'Sullivan <bos@serpentine.com>
parents: 5147
diff changeset
374
9157
9261667e9b82 commands: use minirst parser when displaying help
Martin Geisler <mg@lazybytes.net>
parents: 9087
diff changeset
375 d - done, skip remaining changes and files
9261667e9b82 commands: use minirst parser when displaying help
Martin Geisler <mg@lazybytes.net>
parents: 9087
diff changeset
376 a - record all changes to all remaining files
9261667e9b82 commands: use minirst parser when displaying help
Martin Geisler <mg@lazybytes.net>
parents: 9087
diff changeset
377 q - quit, recording no changes
5154
67afecb8d6cc record: improve docs, improve prompts
Bryan O'Sullivan <bos@serpentine.com>
parents: 5147
diff changeset
378
11237
feb2a58fc592 record: check that we are not committing a merge before patch selection
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11236
diff changeset
379 ? - display help
feb2a58fc592 record: check that we are not committing a merge before patch selection
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11236
diff changeset
380
feb2a58fc592 record: check that we are not committing a merge before patch selection
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11236
diff changeset
381 This command is not available when committing a merge.'''
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
382
14425
e89534504fb9 record: add an option to backup all wc modifications
Idan Kamara <idankk86@gmail.com>
parents: 14424
diff changeset
383 dorecord(ui, repo, commands.commit, 'commit', False, *pats, **opts)
5830
c32d41affb68 hg qrecord -- like record, but for mq
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5827
diff changeset
384
15184
351a9292e430 record: use command wrapper properly for qnew/qrefresh (issue3001)
Matt Mackall <mpm@selenic.com>
parents: 14597
diff changeset
385 def qrefresh(origfn, ui, repo, *pats, **opts):
351a9292e430 record: use command wrapper properly for qnew/qrefresh (issue3001)
Matt Mackall <mpm@selenic.com>
parents: 14597
diff changeset
386 if not opts['interactive']:
351a9292e430 record: use command wrapper properly for qnew/qrefresh (issue3001)
Matt Mackall <mpm@selenic.com>
parents: 14597
diff changeset
387 return origfn(ui, repo, *pats, **opts)
351a9292e430 record: use command wrapper properly for qnew/qrefresh (issue3001)
Matt Mackall <mpm@selenic.com>
parents: 14597
diff changeset
388
14426
1df64ccef23e record: add qrefresh -i/--interactive
Idan Kamara <idankk86@gmail.com>
parents: 14425
diff changeset
389 mq = extensions.find('mq')
1df64ccef23e record: add qrefresh -i/--interactive
Idan Kamara <idankk86@gmail.com>
parents: 14425
diff changeset
390
1df64ccef23e record: add qrefresh -i/--interactive
Idan Kamara <idankk86@gmail.com>
parents: 14425
diff changeset
391 def committomq(ui, repo, *pats, **opts):
1df64ccef23e record: add qrefresh -i/--interactive
Idan Kamara <idankk86@gmail.com>
parents: 14425
diff changeset
392 # At this point the working copy contains only changes that
1df64ccef23e record: add qrefresh -i/--interactive
Idan Kamara <idankk86@gmail.com>
parents: 14425
diff changeset
393 # were accepted. All other changes were reverted.
1df64ccef23e record: add qrefresh -i/--interactive
Idan Kamara <idankk86@gmail.com>
parents: 14425
diff changeset
394 # We can't pass *pats here since qrefresh will undo all other
1df64ccef23e record: add qrefresh -i/--interactive
Idan Kamara <idankk86@gmail.com>
parents: 14425
diff changeset
395 # changed files in the patch that aren't in pats.
1df64ccef23e record: add qrefresh -i/--interactive
Idan Kamara <idankk86@gmail.com>
parents: 14425
diff changeset
396 mq.refresh(ui, repo, **opts)
1df64ccef23e record: add qrefresh -i/--interactive
Idan Kamara <idankk86@gmail.com>
parents: 14425
diff changeset
397
1df64ccef23e record: add qrefresh -i/--interactive
Idan Kamara <idankk86@gmail.com>
parents: 14425
diff changeset
398 # backup all changed files
1df64ccef23e record: add qrefresh -i/--interactive
Idan Kamara <idankk86@gmail.com>
parents: 14425
diff changeset
399 dorecord(ui, repo, committomq, 'qrefresh', True, *pats, **opts)
5830
c32d41affb68 hg qrecord -- like record, but for mq
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5827
diff changeset
400
21251
a836fa58b512 record: declare commands using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20334
diff changeset
401 # This command registration is replaced during uisetup().
21787
fb5f34bb3867 record: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21251
diff changeset
402 @command('qrecord',
fb5f34bb3867 record: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21251
diff changeset
403 [],
fb5f34bb3867 record: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21251
diff changeset
404 _('hg qrecord [OPTION]... PATCH [FILE]...'),
fb5f34bb3867 record: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21251
diff changeset
405 inferrepo=True)
5932
b014ff3fdaeb qrecord: record complements commit, so qrecord should complement qnew
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5830
diff changeset
406 def qrecord(ui, repo, patch, *pats, **opts):
b014ff3fdaeb qrecord: record complements commit, so qrecord should complement qnew
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5830
diff changeset
407 '''interactively record a new patch
5830
c32d41affb68 hg qrecord -- like record, but for mq
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5827
diff changeset
408
10973
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10890
diff changeset
409 See :hg:`help qnew` & :hg:`help record` for more information and
9272
784899697571 record: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9157
diff changeset
410 usage.
5830
c32d41affb68 hg qrecord -- like record, but for mq
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5827
diff changeset
411 '''
c32d41affb68 hg qrecord -- like record, but for mq
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5827
diff changeset
412
c32d41affb68 hg qrecord -- like record, but for mq
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5827
diff changeset
413 try:
c32d41affb68 hg qrecord -- like record, but for mq
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5827
diff changeset
414 mq = extensions.find('mq')
c32d41affb68 hg qrecord -- like record, but for mq
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5827
diff changeset
415 except KeyError:
c32d41affb68 hg qrecord -- like record, but for mq
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5827
diff changeset
416 raise util.Abort(_("'mq' extension not loaded"))
c32d41affb68 hg qrecord -- like record, but for mq
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5827
diff changeset
417
14424
4eb88d296f63 record: check patch name is valid before prompting in qrecord
Idan Kamara <idankk86@gmail.com>
parents: 14408
diff changeset
418 repo.mq.checkpatchname(patch)
4eb88d296f63 record: check patch name is valid before prompting in qrecord
Idan Kamara <idankk86@gmail.com>
parents: 14408
diff changeset
419
10323
0aa59f532ef9 record: function variable naming & signature cleanup.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10282
diff changeset
420 def committomq(ui, repo, *pats, **opts):
14424
4eb88d296f63 record: check patch name is valid before prompting in qrecord
Idan Kamara <idankk86@gmail.com>
parents: 14408
diff changeset
421 opts['checkname'] = False
5932
b014ff3fdaeb qrecord: record complements commit, so qrecord should complement qnew
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5830
diff changeset
422 mq.new(ui, repo, patch, *pats, **opts)
5830
c32d41affb68 hg qrecord -- like record, but for mq
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5827
diff changeset
423
14425
e89534504fb9 record: add an option to backup all wc modifications
Idan Kamara <idankk86@gmail.com>
parents: 14424
diff changeset
424 dorecord(ui, repo, committomq, 'qnew', False, *pats, **opts)
5827
0c29977bd7db record: refactor record into generic record driver
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5826
diff changeset
425
15184
351a9292e430 record: use command wrapper properly for qnew/qrefresh (issue3001)
Matt Mackall <mpm@selenic.com>
parents: 14597
diff changeset
426 def qnew(origfn, ui, repo, patch, *args, **opts):
351a9292e430 record: use command wrapper properly for qnew/qrefresh (issue3001)
Matt Mackall <mpm@selenic.com>
parents: 14597
diff changeset
427 if opts['interactive']:
351a9292e430 record: use command wrapper properly for qnew/qrefresh (issue3001)
Matt Mackall <mpm@selenic.com>
parents: 14597
diff changeset
428 return qrecord(ui, repo, patch, *args, **opts)
351a9292e430 record: use command wrapper properly for qnew/qrefresh (issue3001)
Matt Mackall <mpm@selenic.com>
parents: 14597
diff changeset
429 return origfn(ui, repo, patch, *args, **opts)
351a9292e430 record: use command wrapper properly for qnew/qrefresh (issue3001)
Matt Mackall <mpm@selenic.com>
parents: 14597
diff changeset
430
14425
e89534504fb9 record: add an option to backup all wc modifications
Idan Kamara <idankk86@gmail.com>
parents: 14424
diff changeset
431 def dorecord(ui, repo, commitfunc, cmdsuggest, backupall, *pats, **opts):
8208
32a2a1e244f1 ui: make interactive a method
Matt Mackall <mpm@selenic.com>
parents: 8152
diff changeset
432 if not ui.interactive():
14407
51cabd567ac6 record: suggest the right command when running non interactively
Idan Kamara <idankk86@gmail.com>
parents: 14370
diff changeset
433 raise util.Abort(_('running non-interactively, use %s instead') %
51cabd567ac6 record: suggest the right command when running non interactively
Idan Kamara <idankk86@gmail.com>
parents: 14370
diff changeset
434 cmdsuggest)
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
435
17446
3de04c07966a record: checks for valid username before starting recording process (issue3456)
Sumeet <sumeet@fb.com>
parents: 17425
diff changeset
436 # make sure username is set before going interactive
20171
a765611e06dc record: --user/-u now works with record when ui.username not set (issue3857)
Prasoon Shukla <prasoon92.iitr@gmail.com>
parents: 19497
diff changeset
437 if not opts.get('user'):
a765611e06dc record: --user/-u now works with record when ui.username not set (issue3857)
Prasoon Shukla <prasoon92.iitr@gmail.com>
parents: 19497
diff changeset
438 ui.username() # raise exception, username not provided
17446
3de04c07966a record: checks for valid username before starting recording process (issue3456)
Sumeet <sumeet@fb.com>
parents: 17425
diff changeset
439
6600
b822a379860b match: stop passing files through commitfunc
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
440 def recordfunc(ui, repo, message, match, opts):
5827
0c29977bd7db record: refactor record into generic record driver
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5826
diff changeset
441 """This is generic record driver.
0c29977bd7db record: refactor record into generic record driver
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5826
diff changeset
442
13195
f14cfcc488fb record: clean up comments and docstrings
Kevin Bullock <kbullock@ringworld.org>
parents: 13157
diff changeset
443 Its job is to interactively filter local changes, and
f14cfcc488fb record: clean up comments and docstrings
Kevin Bullock <kbullock@ringworld.org>
parents: 13157
diff changeset
444 accordingly prepare working directory into a state in which the
f14cfcc488fb record: clean up comments and docstrings
Kevin Bullock <kbullock@ringworld.org>
parents: 13157
diff changeset
445 job can be delegated to a non-interactive commit command such as
f14cfcc488fb record: clean up comments and docstrings
Kevin Bullock <kbullock@ringworld.org>
parents: 13157
diff changeset
446 'commit' or 'qrefresh'.
5827
0c29977bd7db record: refactor record into generic record driver
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5826
diff changeset
447
13195
f14cfcc488fb record: clean up comments and docstrings
Kevin Bullock <kbullock@ringworld.org>
parents: 13157
diff changeset
448 After the actual job is done by non-interactive command, the
f14cfcc488fb record: clean up comments and docstrings
Kevin Bullock <kbullock@ringworld.org>
parents: 13157
diff changeset
449 working directory is restored to its original state.
5827
0c29977bd7db record: refactor record into generic record driver
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5826
diff changeset
450
13195
f14cfcc488fb record: clean up comments and docstrings
Kevin Bullock <kbullock@ringworld.org>
parents: 13157
diff changeset
451 In the end we'll record interesting changes, and everything else
f14cfcc488fb record: clean up comments and docstrings
Kevin Bullock <kbullock@ringworld.org>
parents: 13157
diff changeset
452 will be left in place, so the user can continue working.
5827
0c29977bd7db record: refactor record into generic record driver
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5826
diff changeset
453 """
7754
ab00d2c281a8 record: minimize number of status calls
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7718
diff changeset
454
19497
e012a20061ed record: add checkunfinished support (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19226
diff changeset
455 cmdutil.checkunfinished(repo, commit=True)
11237
feb2a58fc592 record: check that we are not committing a merge before patch selection
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11236
diff changeset
456 merge = len(repo[None].parents()) > 1
feb2a58fc592 record: check that we are not committing a merge before patch selection
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11236
diff changeset
457 if merge:
feb2a58fc592 record: check that we are not committing a merge before patch selection
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11236
diff changeset
458 raise util.Abort(_('cannot partially commit a merge '
13023
3e2281b85990 record: quote command in use hg commit message
timeless <timeless@gmail.com>
parents: 12674
diff changeset
459 '(use "hg commit" instead)'))
11237
feb2a58fc592 record: check that we are not committing a merge before patch selection
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11236
diff changeset
460
22921
75e7d4a0f135 record: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 21805
diff changeset
461 status = repo.status(match=match)
23435
486a1fe09422 record: don't honor format-changing diffopts (issue4459)
Siddharth Agarwal <sid0@fb.com>
parents: 23270
diff changeset
462 diffopts = patch.difffeatureopts(ui, opts=opts, whitespace=True)
486a1fe09422 record: don't honor format-changing diffopts (issue4459)
Siddharth Agarwal <sid0@fb.com>
parents: 23270
diff changeset
463 diffopts.nodates = True
486a1fe09422 record: don't honor format-changing diffopts (issue4459)
Siddharth Agarwal <sid0@fb.com>
parents: 23270
diff changeset
464 diffopts.git = True
24235
79fceed67676 record: allow editing new files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents: 23435
diff changeset
465 originalchunks = patch.diff(repo, changes=status, opts=diffopts)
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
466 fp = cStringIO.StringIO()
24235
79fceed67676 record: allow editing new files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents: 23435
diff changeset
467 fp.write(''.join(originalchunks))
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
468 fp.seek(0)
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
469
5827
0c29977bd7db record: refactor record into generic record driver
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5826
diff changeset
470 # 1. filter patch, so we have intending-to apply subset of it
18953
e4ae397595e8 record: abort on malformed patches instead of crashing
Mads Kiilerich <madski@unity3d.com>
parents: 18287
diff changeset
471 try:
e4ae397595e8 record: abort on malformed patches instead of crashing
Mads Kiilerich <madski@unity3d.com>
parents: 18287
diff changeset
472 chunks = filterpatch(ui, parsepatch(fp))
e4ae397595e8 record: abort on malformed patches instead of crashing
Mads Kiilerich <madski@unity3d.com>
parents: 18287
diff changeset
473 except patch.PatchError, err:
e4ae397595e8 record: abort on malformed patches instead of crashing
Mads Kiilerich <madski@unity3d.com>
parents: 18287
diff changeset
474 raise util.Abort(_('error parsing patch: %s') % err)
e4ae397595e8 record: abort on malformed patches instead of crashing
Mads Kiilerich <madski@unity3d.com>
parents: 18287
diff changeset
475
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
476 del fp
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
477
8152
08e1baf924ca replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents: 7983
diff changeset
478 contenders = set()
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
479 for h in chunks:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
480 try:
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
481 contenders.update(set(h.files()))
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
482 except AttributeError:
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
483 pass
5143
d4fa6bafc43a Remove trailing spaces, fix indentation
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5129
diff changeset
484
22921
75e7d4a0f135 record: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 21805
diff changeset
485 changed = status.modified + status.added + status.removed
7754
ab00d2c281a8 record: minimize number of status calls
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7718
diff changeset
486 newfiles = [f for f in changed if f in contenders]
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
487 if not newfiles:
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
488 ui.status(_('no changes to record\n'))
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
489 return 0
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
490
24235
79fceed67676 record: allow editing new files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents: 23435
diff changeset
491 newandmodifiedfiles = set()
79fceed67676 record: allow editing new files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents: 23435
diff changeset
492 for h in chunks:
79fceed67676 record: allow editing new files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents: 23435
diff changeset
493 ishunk = isinstance(h, hunk)
79fceed67676 record: allow editing new files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents: 23435
diff changeset
494 isnew = h.filename() in status.added
79fceed67676 record: allow editing new files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents: 23435
diff changeset
495 if ishunk and isnew and not h in originalchunks:
79fceed67676 record: allow editing new files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents: 23435
diff changeset
496 newandmodifiedfiles.add(h.filename())
79fceed67676 record: allow editing new files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents: 23435
diff changeset
497
22921
75e7d4a0f135 record: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 21805
diff changeset
498 modified = set(status.modified)
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
499
5827
0c29977bd7db record: refactor record into generic record driver
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5826
diff changeset
500 # 2. backup changed files, so we can restore them in the end
24235
79fceed67676 record: allow editing new files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents: 23435
diff changeset
501
14425
e89534504fb9 record: add an option to backup all wc modifications
Idan Kamara <idankk86@gmail.com>
parents: 14424
diff changeset
502 if backupall:
e89534504fb9 record: add an option to backup all wc modifications
Idan Kamara <idankk86@gmail.com>
parents: 14424
diff changeset
503 tobackup = changed
e89534504fb9 record: add an option to backup all wc modifications
Idan Kamara <idankk86@gmail.com>
parents: 14424
diff changeset
504 else:
24235
79fceed67676 record: allow editing new files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents: 23435
diff changeset
505 tobackup = [f for f in newfiles
79fceed67676 record: allow editing new files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents: 23435
diff changeset
506 if f in modified or f in newandmodifiedfiles]
14425
e89534504fb9 record: add an option to backup all wc modifications
Idan Kamara <idankk86@gmail.com>
parents: 14424
diff changeset
507
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
508 backups = {}
14425
e89534504fb9 record: add an option to backup all wc modifications
Idan Kamara <idankk86@gmail.com>
parents: 14424
diff changeset
509 if tobackup:
e89534504fb9 record: add an option to backup all wc modifications
Idan Kamara <idankk86@gmail.com>
parents: 14424
diff changeset
510 backupdir = repo.join('record-backups')
e89534504fb9 record: add an option to backup all wc modifications
Idan Kamara <idankk86@gmail.com>
parents: 14424
diff changeset
511 try:
e89534504fb9 record: add an option to backup all wc modifications
Idan Kamara <idankk86@gmail.com>
parents: 14424
diff changeset
512 os.mkdir(backupdir)
e89534504fb9 record: add an option to backup all wc modifications
Idan Kamara <idankk86@gmail.com>
parents: 14424
diff changeset
513 except OSError, err:
e89534504fb9 record: add an option to backup all wc modifications
Idan Kamara <idankk86@gmail.com>
parents: 14424
diff changeset
514 if err.errno != errno.EEXIST:
e89534504fb9 record: add an option to backup all wc modifications
Idan Kamara <idankk86@gmail.com>
parents: 14424
diff changeset
515 raise
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
516 try:
5827
0c29977bd7db record: refactor record into generic record driver
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5826
diff changeset
517 # backup continues
14425
e89534504fb9 record: add an option to backup all wc modifications
Idan Kamara <idankk86@gmail.com>
parents: 14424
diff changeset
518 for f in tobackup:
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
519 fd, tmpname = tempfile.mkstemp(prefix=f.replace('/', '_')+'.',
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
520 dir=backupdir)
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
521 os.close(fd)
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9272
diff changeset
522 ui.debug('backup %r as %r\n' % (f, tmpname))
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
523 util.copyfile(repo.wjoin(f), tmpname)
13099
a08b49d2f116 record: move copystat() hack out of util.copyfile() and into record
Brodie Rao <brodie@bitheap.org>
parents: 13075
diff changeset
524 shutil.copystat(repo.wjoin(f), tmpname)
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
525 backups[f] = tmpname
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
526
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
527 fp = cStringIO.StringIO()
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
528 for c in chunks:
24235
79fceed67676 record: allow editing new files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents: 23435
diff changeset
529 fname = c.filename()
79fceed67676 record: allow editing new files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents: 23435
diff changeset
530 if fname in backups or fname in newandmodifiedfiles:
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
531 c.write(fp)
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
532 dopatch = fp.tell()
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
533 fp.seek(0)
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
534
24235
79fceed67676 record: allow editing new files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents: 23435
diff changeset
535 [os.unlink(c) for c in newandmodifiedfiles]
79fceed67676 record: allow editing new files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents: 23435
diff changeset
536
5827
0c29977bd7db record: refactor record into generic record driver
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5826
diff changeset
537 # 3a. apply filtered patch to clean repo (clean)
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
538 if backups:
13878
a8d13ee0ce68 misc: replace .parents()[0] with p1()
Matt Mackall <mpm@selenic.com>
parents: 13773
diff changeset
539 hg.revert(repo, repo.dirstate.p1(),
11564
9bbfeba33aa3 record: removed 'has_key' usage
Renato Cunha <renatoc@gmail.com>
parents: 11500
diff changeset
540 lambda key: key in backups)
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
541
5827
0c29977bd7db record: refactor record into generic record driver
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5826
diff changeset
542 # 3b. (apply)
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
543 if dopatch:
6950
381a892159d9 record: catch PatchErrors from internalpatch and display error message
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6949
diff changeset
544 try:
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9272
diff changeset
545 ui.debug('applying patch\n')
6950
381a892159d9 record: catch PatchErrors from internalpatch and display error message
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6949
diff changeset
546 ui.debug(fp.getvalue())
24254
60c279ab7bd3 patch.internalpatch: accept a prefix parameter
Siddharth Agarwal <sid0@fb.com>
parents: 24235
diff changeset
547 patch.internalpatch(ui, repo, fp, 1, '', eolmode=None)
6950
381a892159d9 record: catch PatchErrors from internalpatch and display error message
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6949
diff changeset
548 except patch.PatchError, err:
12674
aa2fe1f52ff4 patch: always raise PatchError with a message, simplify handling
Patrick Mezard <pmezard@gmail.com>
parents: 12266
diff changeset
549 raise util.Abort(str(err))
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
550 del fp
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
551
13195
f14cfcc488fb record: clean up comments and docstrings
Kevin Bullock <kbullock@ringworld.org>
parents: 13157
diff changeset
552 # 4. We prepared working directory according to filtered
f14cfcc488fb record: clean up comments and docstrings
Kevin Bullock <kbullock@ringworld.org>
parents: 13157
diff changeset
553 # patch. Now is the time to delegate the job to
f14cfcc488fb record: clean up comments and docstrings
Kevin Bullock <kbullock@ringworld.org>
parents: 13157
diff changeset
554 # commit/qrefresh or the like!
5827
0c29977bd7db record: refactor record into generic record driver
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5826
diff changeset
555
21805
23f3241406ff record: update comment to match code
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 21787
diff changeset
556 # Make all of the pathnames absolute.
20334
205599e31870 record: use absolute path instead of os.chdir
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20301
diff changeset
557 newfiles = [repo.wjoin(nf) for nf in newfiles]
205599e31870 record: use absolute path instead of os.chdir
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20301
diff changeset
558 commitfunc(ui, repo, *newfiles, **opts)
5827
0c29977bd7db record: refactor record into generic record driver
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5826
diff changeset
559
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
560 return 0
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
561 finally:
5827
0c29977bd7db record: refactor record into generic record driver
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5826
diff changeset
562 # 5. finally restore backed-up files
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
563 try:
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
564 for realname, tmpname in backups.iteritems():
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9272
diff changeset
565 ui.debug('restoring %r to %r\n' % (tmpname, realname))
5128
c9126c24e098 record: work properly if invoked in a subdirectory
Bryan O'Sullivan <bos@serpentine.com>
parents: 5040
diff changeset
566 util.copyfile(tmpname, repo.wjoin(realname))
13099
a08b49d2f116 record: move copystat() hack out of util.copyfile() and into record
Brodie Rao <brodie@bitheap.org>
parents: 13075
diff changeset
567 # Our calls to copystat() here and above are a
a08b49d2f116 record: move copystat() hack out of util.copyfile() and into record
Brodie Rao <brodie@bitheap.org>
parents: 13075
diff changeset
568 # hack to trick any editors that have f open that
a08b49d2f116 record: move copystat() hack out of util.copyfile() and into record
Brodie Rao <brodie@bitheap.org>
parents: 13075
diff changeset
569 # we haven't modified them.
a08b49d2f116 record: move copystat() hack out of util.copyfile() and into record
Brodie Rao <brodie@bitheap.org>
parents: 13075
diff changeset
570 #
a08b49d2f116 record: move copystat() hack out of util.copyfile() and into record
Brodie Rao <brodie@bitheap.org>
parents: 13075
diff changeset
571 # Also note that this racy as an editor could
a08b49d2f116 record: move copystat() hack out of util.copyfile() and into record
Brodie Rao <brodie@bitheap.org>
parents: 13075
diff changeset
572 # notice the file's mtime before we've finished
a08b49d2f116 record: move copystat() hack out of util.copyfile() and into record
Brodie Rao <brodie@bitheap.org>
parents: 13075
diff changeset
573 # writing it.
a08b49d2f116 record: move copystat() hack out of util.copyfile() and into record
Brodie Rao <brodie@bitheap.org>
parents: 13075
diff changeset
574 shutil.copystat(tmpname, repo.wjoin(realname))
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
575 os.unlink(tmpname)
14425
e89534504fb9 record: add an option to backup all wc modifications
Idan Kamara <idankk86@gmail.com>
parents: 14424
diff changeset
576 if tobackup:
e89534504fb9 record: add an option to backup all wc modifications
Idan Kamara <idankk86@gmail.com>
parents: 14424
diff changeset
577 os.rmdir(backupdir)
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
578 except OSError:
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
579 pass
10825
781689b9b6bb record: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10694
diff changeset
580
781689b9b6bb record: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10694
diff changeset
581 # wrap ui.write so diff output can be labeled/colorized
781689b9b6bb record: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10694
diff changeset
582 def wrapwrite(orig, *args, **kw):
781689b9b6bb record: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10694
diff changeset
583 label = kw.pop('label', '')
781689b9b6bb record: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10694
diff changeset
584 for chunk, l in patch.difflabel(lambda: args):
781689b9b6bb record: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10694
diff changeset
585 orig(chunk, label=label + l)
781689b9b6bb record: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10694
diff changeset
586 oldwrite = ui.write
781689b9b6bb record: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10694
diff changeset
587 extensions.wrapfunction(ui, 'write', wrapwrite)
781689b9b6bb record: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10694
diff changeset
588 try:
781689b9b6bb record: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10694
diff changeset
589 return cmdutil.commit(ui, repo, recordfunc, pats, opts)
781689b9b6bb record: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10694
diff changeset
590 finally:
781689b9b6bb record: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10694
diff changeset
591 ui.write = oldwrite
5037
b2607267236d Add record extension, giving darcs-like interactive hunk picking
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
592
9710
1765599f4899 record: use uisetup instead of extsetup to register qrecord
Martin Geisler <mg@lazybytes.net>
parents: 9688
diff changeset
593 def uisetup(ui):
5830
c32d41affb68 hg qrecord -- like record, but for mq
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5827
diff changeset
594 try:
c32d41affb68 hg qrecord -- like record, but for mq
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5827
diff changeset
595 mq = extensions.find('mq')
c32d41affb68 hg qrecord -- like record, but for mq
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5827
diff changeset
596 except KeyError:
c32d41affb68 hg qrecord -- like record, but for mq
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5827
diff changeset
597 return
c32d41affb68 hg qrecord -- like record, but for mq
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5827
diff changeset
598
14408
054da1e0afbe record: use cmdutil.command decorator
Idan Kamara <idankk86@gmail.com>
parents: 14407
diff changeset
599 cmdtable["qrecord"] = \
14427
9d4cabd189df record: alias qrecord to qnew -i/--interactive
Idan Kamara <idankk86@gmail.com>
parents: 14426
diff changeset
600 (qrecord,
9d4cabd189df record: alias qrecord to qnew -i/--interactive
Idan Kamara <idankk86@gmail.com>
parents: 14426
diff changeset
601 # same options as qnew, but copy them so we don't get
14597
3f1dccea9510 record: add white space diff options
Ingo Proetel <proetel@aicas.de>
parents: 14441
diff changeset
602 # -i/--interactive for qrecord and add white space diff options
20300
0076643077a3 record: use commands.diffwsopts instead of ad-hoc diffopts
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 20266
diff changeset
603 mq.cmdtable['^qnew'][1][:] + commands.diffwsopts,
14408
054da1e0afbe record: use cmdutil.command decorator
Idan Kamara <idankk86@gmail.com>
parents: 14407
diff changeset
604 _('hg qrecord [OPTION]... PATCH [FILE]...'))
14426
1df64ccef23e record: add qrefresh -i/--interactive
Idan Kamara <idankk86@gmail.com>
parents: 14425
diff changeset
605
15184
351a9292e430 record: use command wrapper properly for qnew/qrefresh (issue3001)
Matt Mackall <mpm@selenic.com>
parents: 14597
diff changeset
606 _wrapcmd('qnew', mq.cmdtable, qnew, _("interactively record a new patch"))
14426
1df64ccef23e record: add qrefresh -i/--interactive
Idan Kamara <idankk86@gmail.com>
parents: 14425
diff changeset
607 _wrapcmd('qrefresh', mq.cmdtable, qrefresh,
1df64ccef23e record: add qrefresh -i/--interactive
Idan Kamara <idankk86@gmail.com>
parents: 14425
diff changeset
608 _("interactively select changes to refresh"))
1df64ccef23e record: add qrefresh -i/--interactive
Idan Kamara <idankk86@gmail.com>
parents: 14425
diff changeset
609
1df64ccef23e record: add qrefresh -i/--interactive
Idan Kamara <idankk86@gmail.com>
parents: 14425
diff changeset
610 def _wrapcmd(cmd, table, wrapfn, msg):
15184
351a9292e430 record: use command wrapper properly for qnew/qrefresh (issue3001)
Matt Mackall <mpm@selenic.com>
parents: 14597
diff changeset
611 entry = extensions.wrapcommand(table, cmd, wrapfn)
14426
1df64ccef23e record: add qrefresh -i/--interactive
Idan Kamara <idankk86@gmail.com>
parents: 14425
diff changeset
612 entry[1].append(('i', 'interactive', None, msg))