author | Laurent Charignon <lcharignon@fb.com> |
Mon, 09 Mar 2015 13:04:50 -0700 | |
changeset 24261 | 20aac24e2114 |
parent 24254 | 60c279ab7bd3 |
child 24262 | 7f24b2a0581a |
permissions | -rw-r--r-- |
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 | 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 | 22 |
"""like patch.iterhunks, but yield different events |
23 |
||
24 |
- ('file', [header_lines + fromfile + tofile]) |
|
25 |
- ('context', [context_lines]) |
|
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 | 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 | 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 | 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 | 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 | 81 |
XXX shouldn't we merge this with patch.hunk ? |
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 | 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 | 199 |
"""Interactively filter patch chunks into applied-only chunks""" |
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 | 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 | 204 |
- y/n for the rest of file |
205 |
- y/n for the rest |
|
206 |
- ? (help) |
|
207 |
- q (quit) |
|
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 | 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)) |