Mercurial > public > mercurial-scm > hg
annotate mercurial/patch.py @ 48178:f12a19d03d2c
fix: reduce number of tool executions
By grouping together (path, ctx) pairs according to the inputs they would
provide to fixer tools, we can deduplicate executions of fixer tools to
significantly reduce the amount of time spent running slow tools.
This change does not handle clean files in the working copy, which could still
be deduplicated against the files in the checked out commit. It's a little
harder to do that because the filerev is not available in the workingfilectx
(and it doesn't exist for added files).
Anecdotally, this change makes some real uses cases at Google 10x faster. I
think we were originally hesitant to do this because the benefits weren't
obvious, and implementing it efficiently is kind of tricky. If we simply
memoized the formatter execution function, we would be keeping tons of file
content in memory.
Also included is a regression test for a corner case that I broke with my first
attempt at optimizing this code.
Differential Revision: https://phab.mercurial-scm.org/D11280
author | Danny Hooper <hooper@google.com> |
---|---|
date | Thu, 02 Sep 2021 14:08:45 -0700 |
parents | e0d566f3ffce |
children | 6a454e7053a1 |
rev | line source |
---|---|
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
1 # patch.py - patch file parsing routines |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
2 # |
2865
71e78f2ca5ae
merge git patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2863
diff
changeset
|
3 # Copyright 2006 Brendan Cully <brendan@kublai.com> |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
4 # Copyright 2007 Chris Mason <chris.mason@oracle.com> |
2865
71e78f2ca5ae
merge git patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2863
diff
changeset
|
5 # |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8209
diff
changeset
|
6 # This software may be used and distributed according to the terms of the |
10263 | 7 # GNU General Public License version 2 or any later version. |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
8 |
34137
a8994d08e4a2
doctest: use print_function and convert bytes to unicode where needed
Yuya Nishihara <yuya@tcha.org>
parents:
34131
diff
changeset
|
9 from __future__ import absolute_import, print_function |
27485
60183975b5bc
patch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27412
diff
changeset
|
10 |
25113
0ca8410ea345
util: drop alias for collections.deque
Martin von Zweigbergk <martinvonz@google.com>
parents:
24845
diff
changeset
|
11 import collections |
37621
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
12 import contextlib |
27485
60183975b5bc
patch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27412
diff
changeset
|
13 import copy |
60183975b5bc
patch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27412
diff
changeset
|
14 import errno |
60183975b5bc
patch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27412
diff
changeset
|
15 import os |
60183975b5bc
patch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27412
diff
changeset
|
16 import re |
60183975b5bc
patch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27412
diff
changeset
|
17 import shutil |
60183975b5bc
patch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27412
diff
changeset
|
18 import zlib |
10965
7faef79a89c7
patch: move mercurial-specific imports after stdlib imports
Augie Fackler <durin42@gmail.com>
parents:
10905
diff
changeset
|
19 |
27485
60183975b5bc
patch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27412
diff
changeset
|
20 from .i18n import _ |
60183975b5bc
patch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27412
diff
changeset
|
21 from .node import ( |
60183975b5bc
patch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27412
diff
changeset
|
22 hex, |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46693
diff
changeset
|
23 sha1nodeconstants, |
27485
60183975b5bc
patch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27412
diff
changeset
|
24 short, |
60183975b5bc
patch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27412
diff
changeset
|
25 ) |
43085
eef9a2d67051
py3: manually import pycompat.open into files that need it
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43077
diff
changeset
|
26 from .pycompat import open |
27485
60183975b5bc
patch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27412
diff
changeset
|
27 from . import ( |
60183975b5bc
patch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27412
diff
changeset
|
28 copies, |
37803
72f6498c040b
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)
Yuya Nishihara <yuya@tcha.org>
parents:
37764
diff
changeset
|
29 diffhelper, |
38588
1c93e0237a24
diffutil: move the module out of utils package
Yuya Nishihara <yuya@tcha.org>
parents:
38587
diff
changeset
|
30 diffutil, |
27485
60183975b5bc
patch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27412
diff
changeset
|
31 encoding, |
60183975b5bc
patch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27412
diff
changeset
|
32 error, |
28341
8286f551b7ee
patch: when importing from email, RFC2047-decode From/Subject headers
Julien Cristau <julien.cristau@logilab.fr>
parents:
27902
diff
changeset
|
33 mail, |
27485
60183975b5bc
patch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27412
diff
changeset
|
34 mdiff, |
60183975b5bc
patch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27412
diff
changeset
|
35 pathutil, |
30924
48dea083f66d
py3: convert the mode argument of os.fdopen to unicodes (1 of 2)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30819
diff
changeset
|
36 pycompat, |
27485
60183975b5bc
patch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27412
diff
changeset
|
37 scmutil, |
30807
6381a6dbc325
patch: use opt.showsimilarity to calculate and show the similarity
Sean Farley <sean@farley.io>
parents:
30806
diff
changeset
|
38 similar, |
27485
60183975b5bc
patch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27412
diff
changeset
|
39 util, |
31233
067f2a95e32c
vfs: use 'vfs' module directly in 'mercurial.patch'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31216
diff
changeset
|
40 vfs as vfsmod, |
27485
60183975b5bc
patch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27412
diff
changeset
|
41 ) |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36838
diff
changeset
|
42 from .utils import ( |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36838
diff
changeset
|
43 dateutil, |
44060
a61287a95dc3
core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents:
43943
diff
changeset
|
44 hashutil, |
37120
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37084
diff
changeset
|
45 procutil, |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36838
diff
changeset
|
46 stringutil, |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36838
diff
changeset
|
47 ) |
32370
017ad85e5ac8
diffhelpers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32320
diff
changeset
|
48 |
28861
86db5cb55d46
pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents:
28341
diff
changeset
|
49 stringio = util.stringio |
2866
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
50 |
31630
451c980a8b57
patch: make regular expressions bytes by adding b''
Pulkit Goyal <7895pulkit@gmail.com>
parents:
31274
diff
changeset
|
51 gitre = re.compile(br'diff --git a/(.*) b/(.*)') |
451c980a8b57
patch: make regular expressions bytes by adding b''
Pulkit Goyal <7895pulkit@gmail.com>
parents:
31274
diff
changeset
|
52 tabsplitter = re.compile(br'(\t+|[^\t]+)') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
53 wordsplitter = re.compile( |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43106
diff
changeset
|
54 br'(\t+| +|[a-zA-Z0-9_\x80-\xff]+|[^ \ta-zA-Z0-9_\x80-\xff])' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
55 ) |
7199
dd891d0d97a3
patch: consolidate two different regexes for parsing of git diffs
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7198
diff
changeset
|
56 |
34251
61714510220d
error: move patch.PatchError so it can easily implement __bytes__ (API)
Yuya Nishihara <yuya@tcha.org>
parents:
34137
diff
changeset
|
57 PatchError = error.PatchError |
2933
439fd013360d
Move import's working dir update code into patch.updatedir
Brendan Cully <brendan@kublai.com>
parents:
2922
diff
changeset
|
58 |
439fd013360d
Move import's working dir update code into patch.updatedir
Brendan Cully <brendan@kublai.com>
parents:
2922
diff
changeset
|
59 # public functions |
439fd013360d
Move import's working dir update code into patch.updatedir
Brendan Cully <brendan@kublai.com>
parents:
2922
diff
changeset
|
60 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
61 |
10384
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
62 def split(stream): |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
63 '''return an iterator of individual patches from a stream''' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
64 |
10384
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
65 def isheader(line, inheader): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
66 if inheader and line.startswith((b' ', b'\t')): |
10384
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
67 # continuation |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
68 return True |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
69 if line.startswith((b' ', b'-', b'+')): |
10883
196908117c27
patch: don't look for headers in diff lines
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
10748
diff
changeset
|
70 # diff line - don't check for header pattern in there |
196908117c27
patch: don't look for headers in diff lines
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
10748
diff
changeset
|
71 return False |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
72 l = line.split(b': ', 1) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
73 return len(l) == 2 and b' ' not in l[0] |
10384
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
74 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
75 def chunk(lines): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
76 return stringio(b''.join(lines)) |
10384
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
77 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
78 def hgsplit(stream, cur): |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
79 inheader = True |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
80 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
81 for line in stream: |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
82 if not line.strip(): |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
83 inheader = False |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
84 if not inheader and line.startswith(b'# HG changeset patch'): |
10384
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
85 yield chunk(cur) |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
86 cur = [] |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
87 inheader = True |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
88 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
89 cur.append(line) |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
90 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
91 if cur: |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
92 yield chunk(cur) |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
93 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
94 def mboxsplit(stream, cur): |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
95 for line in stream: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
96 if line.startswith(b'From '): |
10384
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
97 for c in split(chunk(cur[1:])): |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
98 yield c |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
99 cur = [] |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
100 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
101 cur.append(line) |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
102 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
103 if cur: |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
104 for c in split(chunk(cur[1:])): |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
105 yield c |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
106 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
107 def mimesplit(stream, cur): |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
108 def msgfp(m): |
28861
86db5cb55d46
pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents:
28341
diff
changeset
|
109 fp = stringio() |
43156
0e6a7ce81dde
py3: use email.generator.BytesGenerator in patch.split()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
43155
diff
changeset
|
110 g = mail.Generator(fp, mangle_from_=False) |
10384
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
111 g.flatten(m) |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
112 fp.seek(0) |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
113 return fp |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
114 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
115 for line in stream: |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
116 cur.append(line) |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
117 c = chunk(cur) |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
118 |
38332
7b12a2d2eedc
py3: ditch email.parser.BytesParser which appears to be plain crap
Yuya Nishihara <yuya@tcha.org>
parents:
38329
diff
changeset
|
119 m = mail.parse(c) |
10384
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
120 if not m.is_multipart(): |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
121 yield msgfp(m) |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
122 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
123 ok_types = (b'text/plain', b'text/x-diff', b'text/x-patch') |
10384
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
124 for part in m.walk(): |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
125 ct = part.get_content_type() |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
126 if ct not in ok_types: |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
127 continue |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
128 yield msgfp(part) |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
129 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
130 def headersplit(stream, cur): |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
131 inheader = False |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
132 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
133 for line in stream: |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
134 if not inheader and isheader(line, inheader): |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
135 yield chunk(cur) |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
136 cur = [] |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
137 inheader = True |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
138 if inheader and not isheader(line, inheader): |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
139 inheader = False |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
140 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
141 cur.append(line) |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
142 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
143 if cur: |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
144 yield chunk(cur) |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
145 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
146 def remainder(cur): |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
147 yield chunk(cur) |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
148 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
149 class fiter(object): |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
150 def __init__(self, fp): |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
151 self.fp = fp |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
152 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
153 def __iter__(self): |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
154 return self |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
155 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
156 def next(self): |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
157 l = self.fp.readline() |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
158 if not l: |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
159 raise StopIteration |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
160 return l |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
161 |
35191
a1d2fc32bb99
py3: define __next__ in patch.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35062
diff
changeset
|
162 __next__ = next |
a1d2fc32bb99
py3: define __next__ in patch.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35062
diff
changeset
|
163 |
10384
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
164 inheader = False |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
165 cur = [] |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
166 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
167 mimeheaders = [b'content-type'] |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
168 |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
169 if not util.safehasattr(stream, b'next'): |
10384
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
170 # http responses, for example, have readline but not next |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
171 stream = fiter(stream) |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
172 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
173 for line in stream: |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
174 cur.append(line) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
175 if line.startswith(b'# HG changeset patch'): |
10384
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
176 return hgsplit(stream, cur) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
177 elif line.startswith(b'From '): |
10384
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
178 return mboxsplit(stream, cur) |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
179 elif isheader(line, inheader): |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
180 inheader = True |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
181 if line.split(b':', 1)[0].lower() in mimeheaders: |
10384
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
182 # let email parser handle this |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
183 return mimesplit(stream, cur) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
184 elif line.startswith(b'--- ') and inheader: |
10501
a27af7229850
import: if in doubt, consume stream until start of diff
Brendan Cully <brendan@kublai.com>
parents:
10467
diff
changeset
|
185 # No evil headers seen by diff start, split by hand |
10384
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
186 return headersplit(stream, cur) |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
187 # Not enough info, keep reading |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
188 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
189 # if we are here, we have a very plain patch |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
190 return remainder(cur) |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
191 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
192 |
26557
23f3f1cbd53b
extract: add some facility for extensible header parsing
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26556
diff
changeset
|
193 ## Some facility for extensible patch parsing: |
23f3f1cbd53b
extract: add some facility for extensible header parsing
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26556
diff
changeset
|
194 # list of pairs ("header to match", "data key") |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
195 patchheadermap = [ |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
196 (b'Date', b'date'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
197 (b'Branch', b'branch'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
198 (b'Node ID', b'nodeid'), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
199 ] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
200 |
26557
23f3f1cbd53b
extract: add some facility for extensible header parsing
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26556
diff
changeset
|
201 |
37621
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
202 @contextlib.contextmanager |
2866
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
203 def extract(ui, fileobj): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45877
diff
changeset
|
204 """extract patch from data read from fileobj. |
2866
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
205 |
4263 | 206 patch can be a normal patch or contained in an email message. |
2866
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
207 |
26781
1aee2ab0f902
spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents:
26587
diff
changeset
|
208 return a dictionary. Standard keys are: |
26547
b9be8ab6e628
patch: move 'extract' return to a dictionnary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26421
diff
changeset
|
209 - filename, |
b9be8ab6e628
patch: move 'extract' return to a dictionnary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26421
diff
changeset
|
210 - message, |
b9be8ab6e628
patch: move 'extract' return to a dictionnary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26421
diff
changeset
|
211 - user, |
b9be8ab6e628
patch: move 'extract' return to a dictionnary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26421
diff
changeset
|
212 - date, |
b9be8ab6e628
patch: move 'extract' return to a dictionnary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26421
diff
changeset
|
213 - branch, |
b9be8ab6e628
patch: move 'extract' return to a dictionnary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26421
diff
changeset
|
214 - node, |
b9be8ab6e628
patch: move 'extract' return to a dictionnary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26421
diff
changeset
|
215 - p1, |
b9be8ab6e628
patch: move 'extract' return to a dictionnary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26421
diff
changeset
|
216 - p2. |
26781
1aee2ab0f902
spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents:
26587
diff
changeset
|
217 Any item can be missing from the dictionary. If filename is missing, |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45877
diff
changeset
|
218 fileobj did not contain a patch. Caller must unlink filename when done.""" |
2866
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
219 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
220 fd, tmpname = pycompat.mkstemp(prefix=b'hg-patch-') |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
221 tmpfp = os.fdopen(fd, 'wb') |
37621
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
222 try: |
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
223 yield _extract(ui, fileobj, tmpname, tmpfp) |
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
224 finally: |
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
225 tmpfp.close() |
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
226 os.unlink(tmpname) |
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
227 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
228 |
37621
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
229 def _extract(ui, fileobj, tmpname, tmpfp): |
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
230 |
2866
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
231 # attempt to detect the start of a patch |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
232 # (this heuristic is borrowed from quilt) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
233 diffre = re.compile( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
234 br'^(?:Index:[ \t]|diff[ \t]-|RCS file: |' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
235 br'retrieving revision [0-9]+(\.[0-9]+)*$|' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
236 br'---[ \t].*?^\+\+\+[ \t]|' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
237 br'\*\*\*[ \t].*?^---[ \t])', |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
238 re.MULTILINE | re.DOTALL, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
239 ) |
2866
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
240 |
26547
b9be8ab6e628
patch: move 'extract' return to a dictionnary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26421
diff
changeset
|
241 data = {} |
37621
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
242 |
38332
7b12a2d2eedc
py3: ditch email.parser.BytesParser which appears to be plain crap
Yuya Nishihara <yuya@tcha.org>
parents:
38329
diff
changeset
|
243 msg = mail.parse(fileobj) |
2866
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
244 |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
245 subject = msg['Subject'] and mail.headdecode(msg['Subject']) |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
246 data[b'user'] = msg['From'] and mail.headdecode(msg['From']) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
247 if not subject and not data[b'user']: |
37621
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
248 # Not an email, restore parsed headers if any |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
249 subject = ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
250 b'\n'.join( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
251 b': '.join(map(encoding.strtolocal, h)) for h in msg.items() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
252 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
253 + b'\n' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
254 ) |
9573
b8352a3617f3
patch: do not swallow header-like patch first line (issue1859)
Patrick Mezard <pmezard@gmail.com>
parents:
9243
diff
changeset
|
255 |
37621
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
256 # should try to parse msg['Date'] |
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
257 parents = [] |
2866
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
258 |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
259 nodeid = msg['X-Mercurial-Node'] |
43097
27c4f93d07a9
import: read X-Mercurial-Node email header to determine nodeid
Denis Laxalde <denis@laxalde.org>
parents:
43085
diff
changeset
|
260 if nodeid: |
27c4f93d07a9
import: read X-Mercurial-Node email header to determine nodeid
Denis Laxalde <denis@laxalde.org>
parents:
43085
diff
changeset
|
261 data[b'nodeid'] = nodeid = mail.headdecode(nodeid) |
27c4f93d07a9
import: read X-Mercurial-Node email header to determine nodeid
Denis Laxalde <denis@laxalde.org>
parents:
43085
diff
changeset
|
262 ui.debug(b'Node ID: %s\n' % nodeid) |
27c4f93d07a9
import: read X-Mercurial-Node email header to determine nodeid
Denis Laxalde <denis@laxalde.org>
parents:
43085
diff
changeset
|
263 |
37621
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
264 if subject: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
265 if subject.startswith(b'[PATCH'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
266 pend = subject.find(b']') |
37621
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
267 if pend >= 0: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
268 subject = subject[pend + 1 :].lstrip() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
269 subject = re.sub(br'\n[ \t]+', b' ', subject) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
270 ui.debug(b'Subject: %s\n' % subject) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
271 if data[b'user']: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
272 ui.debug(b'From: %s\n' % data[b'user']) |
37621
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
273 diffs_seen = 0 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
274 ok_types = (b'text/plain', b'text/x-diff', b'text/x-patch') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
275 message = b'' |
37621
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
276 for part in msg.walk(): |
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
277 content_type = pycompat.bytestr(part.get_content_type()) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
278 ui.debug(b'Content-Type: %s\n' % content_type) |
37621
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
279 if content_type not in ok_types: |
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
280 continue |
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
281 payload = part.get_payload(decode=True) |
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
282 m = diffre.search(payload) |
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
283 if m: |
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
284 hgpatch = False |
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
285 hgpatchheader = False |
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
286 ignoretext = False |
4220
1253703853a8
git-send-email compatibility: stop reading changelog after ^---$
Brendan Cully <brendan@kublai.com>
parents:
4208
diff
changeset
|
287 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
288 ui.debug(b'found patch at byte %d\n' % m.start(0)) |
37621
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
289 diffs_seen += 1 |
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
290 cfp = stringio() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
291 for line in payload[: m.start(0)].splitlines(): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
292 if line.startswith(b'# HG changeset patch') and not hgpatch: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
293 ui.debug(b'patch generated by hg export\n') |
37621
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
294 hgpatch = True |
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
295 hgpatchheader = True |
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
296 # drop earlier commit message content |
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
297 cfp.seek(0) |
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
298 cfp.truncate() |
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
299 subject = None |
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
300 elif hgpatchheader: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
301 if line.startswith(b'# User '): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
302 data[b'user'] = line[7:] |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
303 ui.debug(b'From: %s\n' % data[b'user']) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
304 elif line.startswith(b"# Parent "): |
37621
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
305 parents.append(line[9:].lstrip()) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
306 elif line.startswith(b"# "): |
37621
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
307 for header, key in patchheadermap: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
308 prefix = b'# %s ' % header |
37621
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
309 if line.startswith(prefix): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
310 data[key] = line[len(prefix) :] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
311 ui.debug(b'%s: %s\n' % (header, data[key])) |
37621
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
312 else: |
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
313 hgpatchheader = False |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
314 elif line == b'---': |
37621
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
315 ignoretext = True |
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
316 if not hgpatchheader and not ignoretext: |
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
317 cfp.write(line) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
318 cfp.write(b'\n') |
37621
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
319 message = cfp.getvalue() |
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
320 if tmpfp: |
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
321 tmpfp.write(payload) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
322 if not payload.endswith(b'\n'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
323 tmpfp.write(b'\n') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
324 elif not diffs_seen and message and content_type == b'text/plain': |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
325 message += b'\n' + payload |
2866
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
326 |
4777
5ee5cbfceff3
patch.extract: do not prepend subject if the description already starts with it
Brendan Cully <brendan@kublai.com>
parents:
4659
diff
changeset
|
327 if subject and not message.startswith(subject): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
328 message = b'%s\n%s' % (subject, message) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
329 data[b'message'] = message |
2866
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
330 tmpfp.close() |
24306
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
24269
diff
changeset
|
331 if parents: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
332 data[b'p1'] = parents.pop(0) |
26548
25a58881efdd
extract: simplify parents assignement
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26547
diff
changeset
|
333 if parents: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
334 data[b'p2'] = parents.pop(0) |
24306
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
24269
diff
changeset
|
335 |
26555
1e33384ff2ed
extract: use a single return
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26554
diff
changeset
|
336 if diffs_seen: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
337 data[b'filename'] = tmpname |
37621
5537d8f5e989
patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37574
diff
changeset
|
338 |
26547
b9be8ab6e628
patch: move 'extract' return to a dictionnary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26421
diff
changeset
|
339 return data |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
340 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
341 |
8778
c5f36402daad
use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8761
diff
changeset
|
342 class patchmeta(object): |
7148
7d84e5b00e29
patch: extract and rename gitpatch into patchmeta, document
Patrick Mezard <pmezard@gmail.com>
parents:
7147
diff
changeset
|
343 """Patched file metadata |
7d84e5b00e29
patch: extract and rename gitpatch into patchmeta, document
Patrick Mezard <pmezard@gmail.com>
parents:
7147
diff
changeset
|
344 |
7d84e5b00e29
patch: extract and rename gitpatch into patchmeta, document
Patrick Mezard <pmezard@gmail.com>
parents:
7147
diff
changeset
|
345 'op' is the performed operation within ADD, DELETE, RENAME, MODIFY |
7d84e5b00e29
patch: extract and rename gitpatch into patchmeta, document
Patrick Mezard <pmezard@gmail.com>
parents:
7147
diff
changeset
|
346 or COPY. 'path' is patched file path. 'oldpath' is set to the |
7149
01a056c54385
patch: patchmeta gives (islink, isexec) tuple instead of int mode
Patrick Mezard <pmezard@gmail.com>
parents:
7148
diff
changeset
|
347 origin file when 'op' is either COPY or RENAME, None otherwise. If |
01a056c54385
patch: patchmeta gives (islink, isexec) tuple instead of int mode
Patrick Mezard <pmezard@gmail.com>
parents:
7148
diff
changeset
|
348 file mode is changed, 'mode' is a tuple (islink, isexec) where |
01a056c54385
patch: patchmeta gives (islink, isexec) tuple instead of int mode
Patrick Mezard <pmezard@gmail.com>
parents:
7148
diff
changeset
|
349 'islink' is True if the file is a symlink and 'isexec' is True if |
01a056c54385
patch: patchmeta gives (islink, isexec) tuple instead of int mode
Patrick Mezard <pmezard@gmail.com>
parents:
7148
diff
changeset
|
350 the file is executable. Otherwise, 'mode' is None. |
7148
7d84e5b00e29
patch: extract and rename gitpatch into patchmeta, document
Patrick Mezard <pmezard@gmail.com>
parents:
7147
diff
changeset
|
351 """ |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
352 |
7148
7d84e5b00e29
patch: extract and rename gitpatch into patchmeta, document
Patrick Mezard <pmezard@gmail.com>
parents:
7147
diff
changeset
|
353 def __init__(self, path): |
7d84e5b00e29
patch: extract and rename gitpatch into patchmeta, document
Patrick Mezard <pmezard@gmail.com>
parents:
7147
diff
changeset
|
354 self.path = path |
7d84e5b00e29
patch: extract and rename gitpatch into patchmeta, document
Patrick Mezard <pmezard@gmail.com>
parents:
7147
diff
changeset
|
355 self.oldpath = None |
7d84e5b00e29
patch: extract and rename gitpatch into patchmeta, document
Patrick Mezard <pmezard@gmail.com>
parents:
7147
diff
changeset
|
356 self.mode = None |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
357 self.op = b'MODIFY' |
7148
7d84e5b00e29
patch: extract and rename gitpatch into patchmeta, document
Patrick Mezard <pmezard@gmail.com>
parents:
7147
diff
changeset
|
358 self.binary = False |
7d84e5b00e29
patch: extract and rename gitpatch into patchmeta, document
Patrick Mezard <pmezard@gmail.com>
parents:
7147
diff
changeset
|
359 |
7149
01a056c54385
patch: patchmeta gives (islink, isexec) tuple instead of int mode
Patrick Mezard <pmezard@gmail.com>
parents:
7148
diff
changeset
|
360 def setmode(self, mode): |
25658
e93036747902
global: mass rewrite to use modern octal syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25644
diff
changeset
|
361 islink = mode & 0o20000 |
e93036747902
global: mass rewrite to use modern octal syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25644
diff
changeset
|
362 isexec = mode & 0o100 |
7149
01a056c54385
patch: patchmeta gives (islink, isexec) tuple instead of int mode
Patrick Mezard <pmezard@gmail.com>
parents:
7148
diff
changeset
|
363 self.mode = (islink, isexec) |
01a056c54385
patch: patchmeta gives (islink, isexec) tuple instead of int mode
Patrick Mezard <pmezard@gmail.com>
parents:
7148
diff
changeset
|
364 |
14566
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
365 def copy(self): |
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
366 other = patchmeta(self.path) |
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
367 other.oldpath = self.oldpath |
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
368 other.mode = self.mode |
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
369 other.op = self.op |
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
370 other.binary = self.binary |
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
371 return other |
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
372 |
16506
fc4e0fecf403
patch: fix patch hunk/metdata synchronization (issue3384)
Patrick Mezard <patrick@mezard.eu>
parents:
16475
diff
changeset
|
373 def _ispatchinga(self, afile): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
374 if afile == b'/dev/null': |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
375 return self.op == b'ADD' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
376 return afile == b'a/' + (self.oldpath or self.path) |
16506
fc4e0fecf403
patch: fix patch hunk/metdata synchronization (issue3384)
Patrick Mezard <patrick@mezard.eu>
parents:
16475
diff
changeset
|
377 |
fc4e0fecf403
patch: fix patch hunk/metdata synchronization (issue3384)
Patrick Mezard <patrick@mezard.eu>
parents:
16475
diff
changeset
|
378 def _ispatchingb(self, bfile): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
379 if bfile == b'/dev/null': |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
380 return self.op == b'DELETE' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
381 return bfile == b'b/' + self.path |
16506
fc4e0fecf403
patch: fix patch hunk/metdata synchronization (issue3384)
Patrick Mezard <patrick@mezard.eu>
parents:
16475
diff
changeset
|
382 |
fc4e0fecf403
patch: fix patch hunk/metdata synchronization (issue3384)
Patrick Mezard <patrick@mezard.eu>
parents:
16475
diff
changeset
|
383 def ispatching(self, afile, bfile): |
fc4e0fecf403
patch: fix patch hunk/metdata synchronization (issue3384)
Patrick Mezard <patrick@mezard.eu>
parents:
16475
diff
changeset
|
384 return self._ispatchinga(afile) and self._ispatchingb(bfile) |
fc4e0fecf403
patch: fix patch hunk/metdata synchronization (issue3384)
Patrick Mezard <patrick@mezard.eu>
parents:
16475
diff
changeset
|
385 |
11018
17cf756ba25d
patch: descriptive patchmeta.__repr__ to help debugging
Mads Kiilerich <mads@kiilerich.com>
parents:
10966
diff
changeset
|
386 def __repr__(self): |
43503
313e3a279828
cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents:
43166
diff
changeset
|
387 return "<patchmeta %s %r>" % (self.op, self.path) |
11018
17cf756ba25d
patch: descriptive patchmeta.__repr__ to help debugging
Mads Kiilerich <mads@kiilerich.com>
parents:
10966
diff
changeset
|
388 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
389 |
7152
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
390 def readgitpatch(lr): |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
391 """extract git-style metadata about patches from <patchname>""" |
3223
53e843840349
Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3199
diff
changeset
|
392 |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
393 # Filter patch for git information |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
394 gp = None |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
395 gitpatches = [] |
7152
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
396 for line in lr: |
46246
416ecdaa12df
patch: handle filenames with trailing spaces
Kyle Lippincott <spectral@google.com>
parents:
46030
diff
changeset
|
397 line = line.rstrip(b'\r\n') |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
398 if line.startswith(b'diff --git a/'): |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
399 m = gitre.match(line) |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
400 if m: |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
401 if gp: |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
402 gitpatches.append(gp) |
9392
039bce1b505f
patch: readgitpatch: remove unused variable 'src'
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9331
diff
changeset
|
403 dst = m.group(2) |
7148
7d84e5b00e29
patch: extract and rename gitpatch into patchmeta, document
Patrick Mezard <pmezard@gmail.com>
parents:
7147
diff
changeset
|
404 gp = patchmeta(dst) |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
405 elif gp: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
406 if line.startswith(b'--- '): |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
407 gitpatches.append(gp) |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
408 gp = None |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
409 continue |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
410 if line.startswith(b'rename from '): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
411 gp.op = b'RENAME' |
9243
df21a009c9c4
fix issue 1763: strip chars from end of line when parsing gitpatch lines
Bill Barry <after.fallout@gmail.com>
parents:
9123
diff
changeset
|
412 gp.oldpath = line[12:] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
413 elif line.startswith(b'rename to '): |
9243
df21a009c9c4
fix issue 1763: strip chars from end of line when parsing gitpatch lines
Bill Barry <after.fallout@gmail.com>
parents:
9123
diff
changeset
|
414 gp.path = line[10:] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
415 elif line.startswith(b'copy from '): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
416 gp.op = b'COPY' |
9243
df21a009c9c4
fix issue 1763: strip chars from end of line when parsing gitpatch lines
Bill Barry <after.fallout@gmail.com>
parents:
9123
diff
changeset
|
417 gp.oldpath = line[10:] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
418 elif line.startswith(b'copy to '): |
9243
df21a009c9c4
fix issue 1763: strip chars from end of line when parsing gitpatch lines
Bill Barry <after.fallout@gmail.com>
parents:
9123
diff
changeset
|
419 gp.path = line[8:] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
420 elif line.startswith(b'deleted file'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
421 gp.op = b'DELETE' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
422 elif line.startswith(b'new file mode '): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
423 gp.op = b'ADD' |
9243
df21a009c9c4
fix issue 1763: strip chars from end of line when parsing gitpatch lines
Bill Barry <after.fallout@gmail.com>
parents:
9123
diff
changeset
|
424 gp.setmode(int(line[-6:], 8)) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
425 elif line.startswith(b'new mode '): |
9243
df21a009c9c4
fix issue 1763: strip chars from end of line when parsing gitpatch lines
Bill Barry <after.fallout@gmail.com>
parents:
9123
diff
changeset
|
426 gp.setmode(int(line[-6:], 8)) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
427 elif line.startswith(b'GIT binary patch'): |
3367
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
428 gp.binary = True |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
429 if gp: |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
430 gitpatches.append(gp) |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
431 |
12669
b0fa39c68370
patch: remove unused flags from readgitpatch()
Patrick Mezard <pmezard@gmail.com>
parents:
12645
diff
changeset
|
432 return gitpatches |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
433 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
434 |
8891
5fe8dc75aa4a
patch: use new style class in linereader
Simon Heimberg <simohe@besonet.ch>
parents:
8843
diff
changeset
|
435 class linereader(object): |
8810
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
436 # simple class to allow pushing lines back into the input stream |
14418
0174d1f79280
patch: remove EOL support from linereader class
Patrick Mezard <pmezard@gmail.com>
parents:
14402
diff
changeset
|
437 def __init__(self, fp): |
8810
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
438 self.fp = fp |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
439 self.buf = [] |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
440 |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
441 def push(self, line): |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
442 if line is not None: |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
443 self.buf.append(line) |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
444 |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
445 def readline(self): |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
446 if self.buf: |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
447 l = self.buf[0] |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
448 del self.buf[0] |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
449 return l |
14418
0174d1f79280
patch: remove EOL support from linereader class
Patrick Mezard <pmezard@gmail.com>
parents:
14402
diff
changeset
|
450 return self.fp.readline() |
8810
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
451 |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
452 def __iter__(self): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
453 return iter(self.readline, b'') |
8810
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
454 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
455 |
14348
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
456 class abstractbackend(object): |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
457 def __init__(self, ui): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
458 self.ui = ui |
14348
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
459 |
14391
1e64e1e12195
patch: unify backend file access interface
Patrick Mezard <pmezard@gmail.com>
parents:
14390
diff
changeset
|
460 def getfile(self, fname): |
1e64e1e12195
patch: unify backend file access interface
Patrick Mezard <pmezard@gmail.com>
parents:
14390
diff
changeset
|
461 """Return target file data and flags as a (data, (islink, |
22296
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
21833
diff
changeset
|
462 isexec)) tuple. Data is None if file is missing/deleted. |
14348
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
463 """ |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
464 raise NotImplementedError |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
465 |
14452
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
466 def setfile(self, fname, data, mode, copysource): |
14391
1e64e1e12195
patch: unify backend file access interface
Patrick Mezard <pmezard@gmail.com>
parents:
14390
diff
changeset
|
467 """Write data to target file fname and set its mode. mode is a |
1e64e1e12195
patch: unify backend file access interface
Patrick Mezard <pmezard@gmail.com>
parents:
14390
diff
changeset
|
468 (islink, isexec) tuple. If data is None, the file content should |
14452
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
469 be left unchanged. If the file is modified after being copied, |
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
470 copysource is set to the original file name. |
14367
468d7d1744b4
patch: set desired mode when patching, not in updatedir()
Patrick Mezard <pmezard@gmail.com>
parents:
14366
diff
changeset
|
471 """ |
14348
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
472 raise NotImplementedError |
5652
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
473 |
14348
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
474 def unlink(self, fname): |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
475 """Unlink target file.""" |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
476 raise NotImplementedError |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
477 |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
478 def writerej(self, fname, failed, total, lines): |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
479 """Write rejected lines for fname. total is the number of hunks |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
480 which failed to apply and total the total number of hunks for this |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
481 files. |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
482 """ |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
483 |
14351
d54f9bbcc640
patch: add lexists() to backends, use it in selectfile()
Patrick Mezard <pmezard@gmail.com>
parents:
14350
diff
changeset
|
484 def exists(self, fname): |
d54f9bbcc640
patch: add lexists() to backends, use it in selectfile()
Patrick Mezard <pmezard@gmail.com>
parents:
14350
diff
changeset
|
485 raise NotImplementedError |
d54f9bbcc640
patch: add lexists() to backends, use it in selectfile()
Patrick Mezard <pmezard@gmail.com>
parents:
14350
diff
changeset
|
486 |
33155
b8ae289a7707
patch: add close() to abstractbackend
Martin von Zweigbergk <martinvonz@google.com>
parents:
33104
diff
changeset
|
487 def close(self): |
b8ae289a7707
patch: add close() to abstractbackend
Martin von Zweigbergk <martinvonz@google.com>
parents:
33104
diff
changeset
|
488 raise NotImplementedError |
b8ae289a7707
patch: add close() to abstractbackend
Martin von Zweigbergk <martinvonz@google.com>
parents:
33104
diff
changeset
|
489 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
490 |
14348
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
491 class fsbackend(abstractbackend): |
14350
00da6624e167
patch: move copyfile() into backends, abstract basedir
Patrick Mezard <pmezard@gmail.com>
parents:
14349
diff
changeset
|
492 def __init__(self, ui, basedir): |
14348
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
493 super(fsbackend, self).__init__(ui) |
31233
067f2a95e32c
vfs: use 'vfs' module directly in 'mercurial.patch'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31216
diff
changeset
|
494 self.opener = vfsmod.vfs(basedir) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
495 |
14391
1e64e1e12195
patch: unify backend file access interface
Patrick Mezard <pmezard@gmail.com>
parents:
14390
diff
changeset
|
496 def getfile(self, fname): |
21717
2a095d3442e0
patch: replace functions in fsbackend to use vfs
Chinmay Joshi <c@chinmayjoshi.com>
parents:
21553
diff
changeset
|
497 if self.opener.islink(fname): |
2a095d3442e0
patch: replace functions in fsbackend to use vfs
Chinmay Joshi <c@chinmayjoshi.com>
parents:
21553
diff
changeset
|
498 return (self.opener.readlink(fname), (True, False)) |
2a095d3442e0
patch: replace functions in fsbackend to use vfs
Chinmay Joshi <c@chinmayjoshi.com>
parents:
21553
diff
changeset
|
499 |
14531
b88368a3ade4
patch: remove redundant islink() call
Patrick Mezard <pmezard@gmail.com>
parents:
14494
diff
changeset
|
500 isexec = False |
7392
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
501 try: |
25658
e93036747902
global: mass rewrite to use modern octal syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25644
diff
changeset
|
502 isexec = self.opener.lstat(fname).st_mode & 0o100 != 0 |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25658
diff
changeset
|
503 except OSError as e: |
14391
1e64e1e12195
patch: unify backend file access interface
Patrick Mezard <pmezard@gmail.com>
parents:
14390
diff
changeset
|
504 if e.errno != errno.ENOENT: |
1e64e1e12195
patch: unify backend file access interface
Patrick Mezard <pmezard@gmail.com>
parents:
14390
diff
changeset
|
505 raise |
22296
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
21833
diff
changeset
|
506 try: |
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
21833
diff
changeset
|
507 return (self.opener.read(fname), (False, isexec)) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25658
diff
changeset
|
508 except IOError as e: |
22296
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
21833
diff
changeset
|
509 if e.errno != errno.ENOENT: |
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
21833
diff
changeset
|
510 raise |
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
21833
diff
changeset
|
511 return None, None |
7392
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
512 |
14452
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
513 def setfile(self, fname, data, mode, copysource): |
14391
1e64e1e12195
patch: unify backend file access interface
Patrick Mezard <pmezard@gmail.com>
parents:
14390
diff
changeset
|
514 islink, isexec = mode |
1e64e1e12195
patch: unify backend file access interface
Patrick Mezard <pmezard@gmail.com>
parents:
14390
diff
changeset
|
515 if data is None: |
21717
2a095d3442e0
patch: replace functions in fsbackend to use vfs
Chinmay Joshi <c@chinmayjoshi.com>
parents:
21553
diff
changeset
|
516 self.opener.setflags(fname, islink, isexec) |
14390
ce77c275bec3
patch: merge backend setmode() into writelines()
Patrick Mezard <pmezard@gmail.com>
parents:
14389
diff
changeset
|
517 return |
14391
1e64e1e12195
patch: unify backend file access interface
Patrick Mezard <pmezard@gmail.com>
parents:
14390
diff
changeset
|
518 if islink: |
1e64e1e12195
patch: unify backend file access interface
Patrick Mezard <pmezard@gmail.com>
parents:
14390
diff
changeset
|
519 self.opener.symlink(data, fname) |
14367
468d7d1744b4
patch: set desired mode when patching, not in updatedir()
Patrick Mezard <pmezard@gmail.com>
parents:
14366
diff
changeset
|
520 else: |
14391
1e64e1e12195
patch: unify backend file access interface
Patrick Mezard <pmezard@gmail.com>
parents:
14390
diff
changeset
|
521 self.opener.write(fname, data) |
14367
468d7d1744b4
patch: set desired mode when patching, not in updatedir()
Patrick Mezard <pmezard@gmail.com>
parents:
14366
diff
changeset
|
522 if isexec: |
21717
2a095d3442e0
patch: replace functions in fsbackend to use vfs
Chinmay Joshi <c@chinmayjoshi.com>
parents:
21553
diff
changeset
|
523 self.opener.setflags(fname, False, True) |
7392
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
524 |
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
525 def unlink(self, fname): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
526 rmdir = self.ui.configbool(b'experimental', b'removeemptydirs') |
38493
da2a7d8354b2
unlinkpath: make empty directory removal optional (issue5901) (issue5826)
Kyle Lippincott <spectral@google.com>
parents:
38332
diff
changeset
|
527 self.opener.unlinkpath(fname, ignoremissing=True, rmdir=rmdir) |
7392
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
528 |
14348
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
529 def writerej(self, fname, failed, total, lines): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
530 fname = fname + b".rej" |
14348
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
531 self.ui.warn( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
532 _(b"%d out of %d hunks FAILED -- saving rejects to file %s\n") |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
533 % (failed, total, fname) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
534 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
535 fp = self.opener(fname, b'w') |
14348
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
536 fp.writelines(lines) |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
537 fp.close() |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
538 |
14351
d54f9bbcc640
patch: add lexists() to backends, use it in selectfile()
Patrick Mezard <pmezard@gmail.com>
parents:
14350
diff
changeset
|
539 def exists(self, fname): |
21717
2a095d3442e0
patch: replace functions in fsbackend to use vfs
Chinmay Joshi <c@chinmayjoshi.com>
parents:
21553
diff
changeset
|
540 return self.opener.lexists(fname) |
14351
d54f9bbcc640
patch: add lexists() to backends, use it in selectfile()
Patrick Mezard <pmezard@gmail.com>
parents:
14350
diff
changeset
|
541 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
542 |
14370
17cea10c343e
patch: add a workingbackend dirstate layer on top of fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14369
diff
changeset
|
543 class workingbackend(fsbackend): |
17cea10c343e
patch: add a workingbackend dirstate layer on top of fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14369
diff
changeset
|
544 def __init__(self, ui, repo, similarity): |
17cea10c343e
patch: add a workingbackend dirstate layer on top of fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14369
diff
changeset
|
545 super(workingbackend, self).__init__(ui, repo.root) |
17cea10c343e
patch: add a workingbackend dirstate layer on top of fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14369
diff
changeset
|
546 self.repo = repo |
17cea10c343e
patch: add a workingbackend dirstate layer on top of fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14369
diff
changeset
|
547 self.similarity = similarity |
17cea10c343e
patch: add a workingbackend dirstate layer on top of fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14369
diff
changeset
|
548 self.removed = set() |
17cea10c343e
patch: add a workingbackend dirstate layer on top of fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14369
diff
changeset
|
549 self.changed = set() |
17cea10c343e
patch: add a workingbackend dirstate layer on top of fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14369
diff
changeset
|
550 self.copied = [] |
17cea10c343e
patch: add a workingbackend dirstate layer on top of fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14369
diff
changeset
|
551 |
14453
ea3d548132cc
patch: do not patch unknown files (issue752)
Patrick Mezard <pmezard@gmail.com>
parents:
14452
diff
changeset
|
552 def _checkknown(self, fname): |
48099
e0d566f3ffce
dirstate-item: use `any_tracked` instead of `state` to apply patches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
553 if not self.repo.dirstate.get_entry(fname).any_tracked and self.exists( |
e0d566f3ffce
dirstate-item: use `any_tracked` instead of `state` to apply patches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
554 fname |
e0d566f3ffce
dirstate-item: use `any_tracked` instead of `state` to apply patches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
555 ): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
556 raise PatchError(_(b'cannot patch %s: file is not tracked') % fname) |
14453
ea3d548132cc
patch: do not patch unknown files (issue752)
Patrick Mezard <pmezard@gmail.com>
parents:
14452
diff
changeset
|
557 |
14452
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
558 def setfile(self, fname, data, mode, copysource): |
14453
ea3d548132cc
patch: do not patch unknown files (issue752)
Patrick Mezard <pmezard@gmail.com>
parents:
14452
diff
changeset
|
559 self._checkknown(fname) |
14452
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
560 super(workingbackend, self).setfile(fname, data, mode, copysource) |
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
561 if copysource is not None: |
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
562 self.copied.append((copysource, fname)) |
14370
17cea10c343e
patch: add a workingbackend dirstate layer on top of fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14369
diff
changeset
|
563 self.changed.add(fname) |
17cea10c343e
patch: add a workingbackend dirstate layer on top of fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14369
diff
changeset
|
564 |
17cea10c343e
patch: add a workingbackend dirstate layer on top of fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14369
diff
changeset
|
565 def unlink(self, fname): |
14453
ea3d548132cc
patch: do not patch unknown files (issue752)
Patrick Mezard <pmezard@gmail.com>
parents:
14452
diff
changeset
|
566 self._checkknown(fname) |
14370
17cea10c343e
patch: add a workingbackend dirstate layer on top of fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14369
diff
changeset
|
567 super(workingbackend, self).unlink(fname) |
17cea10c343e
patch: add a workingbackend dirstate layer on top of fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14369
diff
changeset
|
568 self.removed.add(fname) |
17cea10c343e
patch: add a workingbackend dirstate layer on top of fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14369
diff
changeset
|
569 self.changed.add(fname) |
17cea10c343e
patch: add a workingbackend dirstate layer on top of fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14369
diff
changeset
|
570 |
17cea10c343e
patch: add a workingbackend dirstate layer on top of fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14369
diff
changeset
|
571 def close(self): |
17cea10c343e
patch: add a workingbackend dirstate layer on top of fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14369
diff
changeset
|
572 wctx = self.repo[None] |
19155
0b3689a08df5
patch: use scmutil.marktouched instead of scmutil.addremove
Siddharth Agarwal <sid0@fb.com>
parents:
18830
diff
changeset
|
573 changed = set(self.changed) |
14370
17cea10c343e
patch: add a workingbackend dirstate layer on top of fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14369
diff
changeset
|
574 for src, dst in self.copied: |
17cea10c343e
patch: add a workingbackend dirstate layer on top of fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14369
diff
changeset
|
575 scmutil.dirstatecopy(self.ui, self.repo, wctx, src, dst) |
16112
d7829b2ecf32
import: handle git renames and --similarity (issue3187)
Patrick Mezard <patrick@mezard.eu>
parents:
15971
diff
changeset
|
576 if self.removed: |
14435
5f6090e559fa
context: make forget work like commands.forget
Matt Mackall <mpm@selenic.com>
parents:
14418
diff
changeset
|
577 wctx.forget(sorted(self.removed)) |
16112
d7829b2ecf32
import: handle git renames and --similarity (issue3187)
Patrick Mezard <patrick@mezard.eu>
parents:
15971
diff
changeset
|
578 for f in self.removed: |
d7829b2ecf32
import: handle git renames and --similarity (issue3187)
Patrick Mezard <patrick@mezard.eu>
parents:
15971
diff
changeset
|
579 if f not in self.repo.dirstate: |
d7829b2ecf32
import: handle git renames and --similarity (issue3187)
Patrick Mezard <patrick@mezard.eu>
parents:
15971
diff
changeset
|
580 # File was deleted and no longer belongs to the |
d7829b2ecf32
import: handle git renames and --similarity (issue3187)
Patrick Mezard <patrick@mezard.eu>
parents:
15971
diff
changeset
|
581 # dirstate, it was probably marked added then |
d7829b2ecf32
import: handle git renames and --similarity (issue3187)
Patrick Mezard <patrick@mezard.eu>
parents:
15971
diff
changeset
|
582 # deleted, and should not be considered by |
19155
0b3689a08df5
patch: use scmutil.marktouched instead of scmutil.addremove
Siddharth Agarwal <sid0@fb.com>
parents:
18830
diff
changeset
|
583 # marktouched(). |
0b3689a08df5
patch: use scmutil.marktouched instead of scmutil.addremove
Siddharth Agarwal <sid0@fb.com>
parents:
18830
diff
changeset
|
584 changed.discard(f) |
0b3689a08df5
patch: use scmutil.marktouched instead of scmutil.addremove
Siddharth Agarwal <sid0@fb.com>
parents:
18830
diff
changeset
|
585 if changed: |
0b3689a08df5
patch: use scmutil.marktouched instead of scmutil.addremove
Siddharth Agarwal <sid0@fb.com>
parents:
18830
diff
changeset
|
586 scmutil.marktouched(self.repo, changed, self.similarity) |
14370
17cea10c343e
patch: add a workingbackend dirstate layer on top of fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14369
diff
changeset
|
587 return sorted(self.changed) |
17cea10c343e
patch: add a workingbackend dirstate layer on top of fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14369
diff
changeset
|
588 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
589 |
14452
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
590 class filestore(object): |
14658
7ddf9a607b75
patch: make filestore store data in memory and fallback to fs
Patrick Mezard <pmezard@gmail.com>
parents:
14611
diff
changeset
|
591 def __init__(self, maxsize=None): |
14452
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
592 self.opener = None |
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
593 self.files = {} |
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
594 self.created = 0 |
14658
7ddf9a607b75
patch: make filestore store data in memory and fallback to fs
Patrick Mezard <pmezard@gmail.com>
parents:
14611
diff
changeset
|
595 self.maxsize = maxsize |
7ddf9a607b75
patch: make filestore store data in memory and fallback to fs
Patrick Mezard <pmezard@gmail.com>
parents:
14611
diff
changeset
|
596 if self.maxsize is None: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
597 self.maxsize = 4 * (2 ** 20) |
14658
7ddf9a607b75
patch: make filestore store data in memory and fallback to fs
Patrick Mezard <pmezard@gmail.com>
parents:
14611
diff
changeset
|
598 self.size = 0 |
7ddf9a607b75
patch: make filestore store data in memory and fallback to fs
Patrick Mezard <pmezard@gmail.com>
parents:
14611
diff
changeset
|
599 self.data = {} |
14452
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
600 |
14609
f53dc0787424
patch: extend filtestore to store an optional copy source
Patrick Mezard <pmezard@gmail.com>
parents:
14566
diff
changeset
|
601 def setfile(self, fname, data, mode, copied=None): |
14658
7ddf9a607b75
patch: make filestore store data in memory and fallback to fs
Patrick Mezard <pmezard@gmail.com>
parents:
14611
diff
changeset
|
602 if self.maxsize < 0 or (len(data) + self.size) <= self.maxsize: |
7ddf9a607b75
patch: make filestore store data in memory and fallback to fs
Patrick Mezard <pmezard@gmail.com>
parents:
14611
diff
changeset
|
603 self.data[fname] = (data, mode, copied) |
7ddf9a607b75
patch: make filestore store data in memory and fallback to fs
Patrick Mezard <pmezard@gmail.com>
parents:
14611
diff
changeset
|
604 self.size += len(data) |
7ddf9a607b75
patch: make filestore store data in memory and fallback to fs
Patrick Mezard <pmezard@gmail.com>
parents:
14611
diff
changeset
|
605 else: |
7ddf9a607b75
patch: make filestore store data in memory and fallback to fs
Patrick Mezard <pmezard@gmail.com>
parents:
14611
diff
changeset
|
606 if self.opener is None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
607 root = pycompat.mkdtemp(prefix=b'hg-patch-') |
31233
067f2a95e32c
vfs: use 'vfs' module directly in 'mercurial.patch'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31216
diff
changeset
|
608 self.opener = vfsmod.vfs(root) |
14658
7ddf9a607b75
patch: make filestore store data in memory and fallback to fs
Patrick Mezard <pmezard@gmail.com>
parents:
14611
diff
changeset
|
609 # Avoid filename issues with these simple names |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
610 fn = b'%d' % self.created |
14658
7ddf9a607b75
patch: make filestore store data in memory and fallback to fs
Patrick Mezard <pmezard@gmail.com>
parents:
14611
diff
changeset
|
611 self.opener.write(fn, data) |
7ddf9a607b75
patch: make filestore store data in memory and fallback to fs
Patrick Mezard <pmezard@gmail.com>
parents:
14611
diff
changeset
|
612 self.created += 1 |
7ddf9a607b75
patch: make filestore store data in memory and fallback to fs
Patrick Mezard <pmezard@gmail.com>
parents:
14611
diff
changeset
|
613 self.files[fname] = (fn, mode, copied) |
14452
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
614 |
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
615 def getfile(self, fname): |
14658
7ddf9a607b75
patch: make filestore store data in memory and fallback to fs
Patrick Mezard <pmezard@gmail.com>
parents:
14611
diff
changeset
|
616 if fname in self.data: |
7ddf9a607b75
patch: make filestore store data in memory and fallback to fs
Patrick Mezard <pmezard@gmail.com>
parents:
14611
diff
changeset
|
617 return self.data[fname] |
7ddf9a607b75
patch: make filestore store data in memory and fallback to fs
Patrick Mezard <pmezard@gmail.com>
parents:
14611
diff
changeset
|
618 if not self.opener or fname not in self.files: |
22296
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
21833
diff
changeset
|
619 return None, None, None |
14609
f53dc0787424
patch: extend filtestore to store an optional copy source
Patrick Mezard <pmezard@gmail.com>
parents:
14566
diff
changeset
|
620 fn, mode, copied = self.files[fname] |
f53dc0787424
patch: extend filtestore to store an optional copy source
Patrick Mezard <pmezard@gmail.com>
parents:
14566
diff
changeset
|
621 return self.opener.read(fn), mode, copied |
14452
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
622 |
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
623 def close(self): |
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
624 if self.opener: |
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
625 shutil.rmtree(self.opener.base) |
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
626 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
627 |
14611
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
628 class repobackend(abstractbackend): |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
629 def __init__(self, ui, repo, ctx, store): |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
630 super(repobackend, self).__init__(ui) |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
631 self.repo = repo |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
632 self.ctx = ctx |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
633 self.store = store |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
634 self.changed = set() |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
635 self.removed = set() |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
636 self.copied = {} |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
637 |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
638 def _checkknown(self, fname): |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
639 if fname not in self.ctx: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
640 raise PatchError(_(b'cannot patch %s: file is not tracked') % fname) |
14611
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
641 |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
642 def getfile(self, fname): |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
643 try: |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
644 fctx = self.ctx[fname] |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
645 except error.LookupError: |
22296
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
21833
diff
changeset
|
646 return None, None |
14611
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
647 flags = fctx.flags() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
648 return fctx.data(), (b'l' in flags, b'x' in flags) |
14611
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
649 |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
650 def setfile(self, fname, data, mode, copysource): |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
651 if copysource: |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
652 self._checkknown(copysource) |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
653 if data is None: |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
654 data = self.ctx[fname].data() |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
655 self.store.setfile(fname, data, mode, copysource) |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
656 self.changed.add(fname) |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
657 if copysource: |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
658 self.copied[fname] = copysource |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
659 |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
660 def unlink(self, fname): |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
661 self._checkknown(fname) |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
662 self.removed.add(fname) |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
663 |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
664 def exists(self, fname): |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
665 return fname in self.ctx |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
666 |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
667 def close(self): |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
668 return self.changed | self.removed |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
669 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
670 |
14348
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
671 # @@ -start,len +start,len @@ or @@ -start +start @@ if len is 1 |
41532
bd3f03d8cc9f
global: use raw strings for regular expressions with escapes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41499
diff
changeset
|
672 unidesc = re.compile(br'@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@') |
bd3f03d8cc9f
global: use raw strings for regular expressions with escapes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41499
diff
changeset
|
673 contextdesc = re.compile(br'(?:---|\*\*\*) (\d+)(?:,(\d+))? (?:---|\*\*\*)') |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
674 eolmodes = [b'strict', b'crlf', b'lf', b'auto'] |
14348
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
675 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
676 |
14348
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
677 class patchfile(object): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
678 def __init__(self, ui, gp, backend, store, eolmode=b'strict'): |
14566
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
679 self.fname = gp.path |
14348
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
680 self.eolmode = eolmode |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
681 self.eol = None |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
682 self.backend = backend |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
683 self.ui = ui |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
684 self.lines = [] |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
685 self.exists = False |
14452
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
686 self.missing = True |
14566
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
687 self.mode = gp.mode |
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
688 self.copysource = gp.oldpath |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
689 self.create = gp.op in (b'ADD', b'COPY', b'RENAME') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
690 self.remove = gp.op == b'DELETE' |
22296
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
21833
diff
changeset
|
691 if self.copysource is None: |
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
21833
diff
changeset
|
692 data, mode = backend.getfile(self.fname) |
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
21833
diff
changeset
|
693 else: |
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
21833
diff
changeset
|
694 data, mode = store.getfile(self.copysource)[:2] |
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
21833
diff
changeset
|
695 if data is not None: |
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
21833
diff
changeset
|
696 self.exists = self.copysource is None or backend.exists(self.fname) |
14452
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
697 self.missing = False |
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
698 if data: |
14832
d60e4f227d75
patch: fix parsing patch files containing CRs not followed by LFs
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
14764
diff
changeset
|
699 self.lines = mdiff.splitnewlines(data) |
14452
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
700 if self.mode is None: |
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
701 self.mode = mode |
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
702 if self.lines: |
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
703 # Normalize line endings |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
704 if self.lines[0].endswith(b'\r\n'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
705 self.eol = b'\r\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
706 elif self.lines[0].endswith(b'\n'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
707 self.eol = b'\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
708 if eolmode != b'strict': |
14452
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
709 nlines = [] |
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
710 for l in self.lines: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
711 if l.endswith(b'\r\n'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
712 l = l[:-2] + b'\n' |
14452
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
713 nlines.append(l) |
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
714 self.lines = nlines |
22296
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
21833
diff
changeset
|
715 else: |
14566
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
716 if self.create: |
14452
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
717 self.missing = False |
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
718 if self.mode is None: |
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
719 self.mode = (False, False) |
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
720 if self.missing: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
721 self.ui.warn(_(b"unable to find '%s' for patching\n") % self.fname) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
722 self.ui.warn( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
723 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
724 b"(use '--prefix' to apply patch relative to the " |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
725 b"current directory)\n" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
726 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
727 ) |
14348
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
728 |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
729 self.hash = {} |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
730 self.dirty = 0 |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
731 self.offset = 0 |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
732 self.skew = 0 |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
733 self.rej = [] |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
734 self.fileprinted = False |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
735 self.printfile(False) |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
736 self.hunks = 0 |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
737 |
14367
468d7d1744b4
patch: set desired mode when patching, not in updatedir()
Patrick Mezard <pmezard@gmail.com>
parents:
14366
diff
changeset
|
738 def writelines(self, fname, lines, mode): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
739 if self.eolmode == b'auto': |
14348
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
740 eol = self.eol |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
741 elif self.eolmode == b'crlf': |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
742 eol = b'\r\n' |
14348
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
743 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
744 eol = b'\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
745 |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
746 if self.eolmode != b'strict' and eol and eol != b'\n': |
14348
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
747 rawlines = [] |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
748 for l in lines: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
749 if l and l.endswith(b'\n'): |
14348
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
750 l = l[:-1] + eol |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
751 rawlines.append(l) |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
752 lines = rawlines |
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
753 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
754 self.backend.setfile(fname, b''.join(lines), mode, self.copysource) |
14348
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
755 |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
756 def printfile(self, warn): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
757 if self.fileprinted: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
758 return |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
759 if warn or self.ui.verbose: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
760 self.fileprinted = True |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
761 s = _(b"patching file %s\n") % self.fname |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
762 if warn: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
763 self.ui.warn(s) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
764 else: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
765 self.ui.note(s) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
766 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
767 def findlines(self, l, linenum): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
768 # looks through the hash and finds candidate lines. The |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
769 # result is a list of line numbers sorted based on distance |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
770 # from linenum |
5143
d4fa6bafc43a
Remove trailing spaces, fix indentation
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5116
diff
changeset
|
771 |
9681
ac3a68cb16eb
patch: simplify logic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9642
diff
changeset
|
772 cand = self.hash.get(l, []) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
773 if len(cand) > 1: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
774 # resort our list of potentials forward then back. |
9032
1fa80c5428b8
compat: use 'key' argument instead of 'cmp' when sorting a list
Alejandro Santos <alejolp@alejolp.com>
parents:
9031
diff
changeset
|
775 cand.sort(key=lambda x: abs(x - linenum)) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
776 return cand |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
777 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
778 def write_rej(self): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
779 # our rejects are a little different from patch(1). This always |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
780 # creates rejects in the same form as the original patch. A file |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
781 # header is inserted so that you can run the reject through patch again |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
782 # without having to type the filename. |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
783 if not self.rej: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
784 return |
14349
776ae95b8835
patch: merge makerejlines() into write_rej()
Patrick Mezard <pmezard@gmail.com>
parents:
14348
diff
changeset
|
785 base = os.path.basename(self.fname) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
786 lines = [b"--- %s\n+++ %s\n" % (base, base)] |
14349
776ae95b8835
patch: merge makerejlines() into write_rej()
Patrick Mezard <pmezard@gmail.com>
parents:
14348
diff
changeset
|
787 for x in self.rej: |
776ae95b8835
patch: merge makerejlines() into write_rej()
Patrick Mezard <pmezard@gmail.com>
parents:
14348
diff
changeset
|
788 for l in x.hunk: |
776ae95b8835
patch: merge makerejlines() into write_rej()
Patrick Mezard <pmezard@gmail.com>
parents:
14348
diff
changeset
|
789 lines.append(l) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
790 if l[-1:] != b'\n': |
45154
10f48720ef95
diff: move no-eol text constant to a common location
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
45098
diff
changeset
|
791 lines.append(b'\n' + diffhelper.MISSING_NEWLINE_MARKER) |
14349
776ae95b8835
patch: merge makerejlines() into write_rej()
Patrick Mezard <pmezard@gmail.com>
parents:
14348
diff
changeset
|
792 self.backend.writerej(self.fname, len(self.rej), self.hunks, lines) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
793 |
9393
23c4e772c172
patch: remove the unused, broken reverse() function
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9392
diff
changeset
|
794 def apply(self, h): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
795 if not h.complete(): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
796 raise PatchError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
797 _(b"bad hunk #%d %s (%d %d %d %d)") |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
798 % (h.number, h.desc, len(h.a), h.lena, len(h.b), h.lenb) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
799 ) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
800 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
801 self.hunks += 1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
802 |
5652
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
803 if self.missing: |
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
804 self.rej.append(h) |
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
805 return -1 |
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
806 |
14451
c78d41db6f88
patch: refactor file creation/removal detection
Patrick Mezard <pmezard@gmail.com>
parents:
14437
diff
changeset
|
807 if self.exists and self.create: |
14452
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
808 if self.copysource: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
809 self.ui.warn( |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43106
diff
changeset
|
810 _(b"cannot create %s: destination already exists\n") |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
811 % self.fname |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
812 ) |
14452
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
813 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
814 self.ui.warn(_(b"file %s already exists\n") % self.fname) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
815 self.rej.append(h) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
816 return -1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
817 |
9585
ea1935e2020a
patch: handle symlinks without symlinkhunk
Patrick Mezard <pmezard@gmail.com>
parents:
9573
diff
changeset
|
818 if isinstance(h, binhunk): |
14451
c78d41db6f88
patch: refactor file creation/removal detection
Patrick Mezard <pmezard@gmail.com>
parents:
14437
diff
changeset
|
819 if self.remove: |
14348
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
820 self.backend.unlink(self.fname) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
821 else: |
20137
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
822 l = h.new(self.lines) |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
823 self.lines[:] = l |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
824 self.offset += len(l) |
14217
71d5287351e9
patchfile: use real Booleans instead of 0/1
Martin Geisler <mg@aragost.com>
parents:
14017
diff
changeset
|
825 self.dirty = True |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
826 return 0 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
827 |
10127
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
828 horig = h |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
829 if ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
830 self.eolmode in (b'crlf', b'lf') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
831 or self.eolmode == b'auto' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
832 and self.eol |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
833 ): |
10128
ea7c392f2b08
patch: drop eol normalization fast-path for 'lf' and 'crlf'
Patrick Mezard <pmezard@gmail.com>
parents:
10127
diff
changeset
|
834 # If new eols are going to be normalized, then normalize |
ea7c392f2b08
patch: drop eol normalization fast-path for 'lf' and 'crlf'
Patrick Mezard <pmezard@gmail.com>
parents:
10127
diff
changeset
|
835 # hunk data before patching. Otherwise, preserve input |
ea7c392f2b08
patch: drop eol normalization fast-path for 'lf' and 'crlf'
Patrick Mezard <pmezard@gmail.com>
parents:
10127
diff
changeset
|
836 # line-endings. |
10127
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
837 h = h.getnormalized() |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
838 |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
839 # fast case first, no offsets, no fuzz |
16122
9ef3a4a2c6c0
patch: make hunk.fuzzit() compute the fuzzed start locations
Patrick Mezard <patrick@mezard.eu>
parents:
16121
diff
changeset
|
840 old, oldstart, new, newstart = h.fuzzit(0, False) |
9ef3a4a2c6c0
patch: make hunk.fuzzit() compute the fuzzed start locations
Patrick Mezard <patrick@mezard.eu>
parents:
16121
diff
changeset
|
841 oldstart += self.offset |
9ef3a4a2c6c0
patch: make hunk.fuzzit() compute the fuzzed start locations
Patrick Mezard <patrick@mezard.eu>
parents:
16121
diff
changeset
|
842 orig_start = oldstart |
10135
9a4034b630c4
patch: better handling of sequence of offset patch hunks (issue1941)
Greg Onufer <gonufer@jazzhaiku.com>
parents:
9725
diff
changeset
|
843 # if there's skew we want to emit the "(offset %d lines)" even |
9a4034b630c4
patch: better handling of sequence of offset patch hunks (issue1941)
Greg Onufer <gonufer@jazzhaiku.com>
parents:
9725
diff
changeset
|
844 # when the hunk cleanly applies at start + skew, so skip the |
9a4034b630c4
patch: better handling of sequence of offset patch hunks (issue1941)
Greg Onufer <gonufer@jazzhaiku.com>
parents:
9725
diff
changeset
|
845 # fast case code |
37803
72f6498c040b
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)
Yuya Nishihara <yuya@tcha.org>
parents:
37764
diff
changeset
|
846 if self.skew == 0 and diffhelper.testhunk(old, self.lines, oldstart): |
14451
c78d41db6f88
patch: refactor file creation/removal detection
Patrick Mezard <pmezard@gmail.com>
parents:
14437
diff
changeset
|
847 if self.remove: |
14348
c1c719103392
patch: extract fs access from patchfile into fsbackend
Patrick Mezard <pmezard@gmail.com>
parents:
14347
diff
changeset
|
848 self.backend.unlink(self.fname) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
849 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
850 self.lines[oldstart : oldstart + len(old)] = new |
16122
9ef3a4a2c6c0
patch: make hunk.fuzzit() compute the fuzzed start locations
Patrick Mezard <patrick@mezard.eu>
parents:
16121
diff
changeset
|
851 self.offset += len(new) - len(old) |
14217
71d5287351e9
patchfile: use real Booleans instead of 0/1
Martin Geisler <mg@aragost.com>
parents:
14017
diff
changeset
|
852 self.dirty = True |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
853 return 0 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
854 |
13700
63307feb59dd
patch: inline patchfile.hashlines()
Patrick Mezard <pmezard@gmail.com>
parents:
13699
diff
changeset
|
855 # ok, we couldn't match the hunk. Lets look for offsets and fuzz it |
63307feb59dd
patch: inline patchfile.hashlines()
Patrick Mezard <pmezard@gmail.com>
parents:
13699
diff
changeset
|
856 self.hash = {} |
63307feb59dd
patch: inline patchfile.hashlines()
Patrick Mezard <pmezard@gmail.com>
parents:
13699
diff
changeset
|
857 for x, s in enumerate(self.lines): |
63307feb59dd
patch: inline patchfile.hashlines()
Patrick Mezard <pmezard@gmail.com>
parents:
13699
diff
changeset
|
858 self.hash.setdefault(s, []).append(x) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
859 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
860 for fuzzlen in pycompat.xrange( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
861 self.ui.configint(b"patch", b"fuzz") + 1 |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
862 ): |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
863 for toponly in [True, False]: |
16122
9ef3a4a2c6c0
patch: make hunk.fuzzit() compute the fuzzed start locations
Patrick Mezard <patrick@mezard.eu>
parents:
16121
diff
changeset
|
864 old, oldstart, new, newstart = h.fuzzit(fuzzlen, toponly) |
16123
b0c7525f826d
patch: fix fuzzing of hunks without previous lines (issue3264)
Patrick Mezard <patrick@mezard.eu>
parents:
16122
diff
changeset
|
865 oldstart = oldstart + self.offset + self.skew |
b0c7525f826d
patch: fix fuzzing of hunks without previous lines (issue3264)
Patrick Mezard <patrick@mezard.eu>
parents:
16122
diff
changeset
|
866 oldstart = min(oldstart, len(self.lines)) |
b0c7525f826d
patch: fix fuzzing of hunks without previous lines (issue3264)
Patrick Mezard <patrick@mezard.eu>
parents:
16122
diff
changeset
|
867 if old: |
b0c7525f826d
patch: fix fuzzing of hunks without previous lines (issue3264)
Patrick Mezard <patrick@mezard.eu>
parents:
16122
diff
changeset
|
868 cand = self.findlines(old[0][1:], oldstart) |
b0c7525f826d
patch: fix fuzzing of hunks without previous lines (issue3264)
Patrick Mezard <patrick@mezard.eu>
parents:
16122
diff
changeset
|
869 else: |
b0c7525f826d
patch: fix fuzzing of hunks without previous lines (issue3264)
Patrick Mezard <patrick@mezard.eu>
parents:
16122
diff
changeset
|
870 # Only adding lines with no or fuzzed context, just |
b0c7525f826d
patch: fix fuzzing of hunks without previous lines (issue3264)
Patrick Mezard <patrick@mezard.eu>
parents:
16122
diff
changeset
|
871 # take the skew in account |
b0c7525f826d
patch: fix fuzzing of hunks without previous lines (issue3264)
Patrick Mezard <patrick@mezard.eu>
parents:
16122
diff
changeset
|
872 cand = [oldstart] |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
873 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
874 for l in cand: |
37803
72f6498c040b
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)
Yuya Nishihara <yuya@tcha.org>
parents:
37764
diff
changeset
|
875 if not old or diffhelper.testhunk(old, self.lines, l): |
16121
ccba74472af2
patch: fuzz old and new lines at the same time
Patrick Mezard <patrick@mezard.eu>
parents:
16112
diff
changeset
|
876 self.lines[l : l + len(old)] = new |
ccba74472af2
patch: fuzz old and new lines at the same time
Patrick Mezard <patrick@mezard.eu>
parents:
16112
diff
changeset
|
877 self.offset += len(new) - len(old) |
10135
9a4034b630c4
patch: better handling of sequence of offset patch hunks (issue1941)
Greg Onufer <gonufer@jazzhaiku.com>
parents:
9725
diff
changeset
|
878 self.skew = l - orig_start |
14217
71d5287351e9
patchfile: use real Booleans instead of 0/1
Martin Geisler <mg@aragost.com>
parents:
14017
diff
changeset
|
879 self.dirty = True |
10518
5fe51d348daf
patch, i18n: avoid parameterized messages
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
10501
diff
changeset
|
880 offset = l - orig_start - fuzzlen |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
881 if fuzzlen: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
882 msg = _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
883 b"Hunk #%d succeeded at %d " |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
884 b"with fuzz %d " |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
885 b"(offset %d lines).\n" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
886 ) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
887 self.printfile(True) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
888 self.ui.warn( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
889 msg % (h.number, l + 1, fuzzlen, offset) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
890 ) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
891 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
892 msg = _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
893 b"Hunk #%d succeeded at %d " |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
894 b"(offset %d lines).\n" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
895 ) |
10518
5fe51d348daf
patch, i18n: avoid parameterized messages
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
10501
diff
changeset
|
896 self.ui.note(msg % (h.number, l + 1, offset)) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
897 return fuzzlen |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
898 self.printfile(True) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
899 self.ui.warn(_(b"Hunk #%d FAILED at %d\n") % (h.number, orig_start)) |
10127
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
900 self.rej.append(horig) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
901 return -1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
902 |
13701
bc38ff7cb919
patch: move closefile() into patchfile.close()
Patrick Mezard <pmezard@gmail.com>
parents:
13700
diff
changeset
|
903 def close(self): |
bc38ff7cb919
patch: move closefile() into patchfile.close()
Patrick Mezard <pmezard@gmail.com>
parents:
13700
diff
changeset
|
904 if self.dirty: |
14367
468d7d1744b4
patch: set desired mode when patching, not in updatedir()
Patrick Mezard <pmezard@gmail.com>
parents:
14366
diff
changeset
|
905 self.writelines(self.fname, self.lines, self.mode) |
13701
bc38ff7cb919
patch: move closefile() into patchfile.close()
Patrick Mezard <pmezard@gmail.com>
parents:
13700
diff
changeset
|
906 self.write_rej() |
bc38ff7cb919
patch: move closefile() into patchfile.close()
Patrick Mezard <pmezard@gmail.com>
parents:
13700
diff
changeset
|
907 return len(self.rej) |
bc38ff7cb919
patch: move closefile() into patchfile.close()
Patrick Mezard <pmezard@gmail.com>
parents:
13700
diff
changeset
|
908 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
909 |
24261
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
910 class header(object): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45877
diff
changeset
|
911 """patch header""" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
912 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
913 diffgit_re = re.compile(b'diff --git a/(.*) b/(.*)$') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
914 diff_re = re.compile(b'diff -r .* (.*)$') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
915 allhunks_re = re.compile(b'(?:index|deleted file) ') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
916 pretty_re = re.compile(b'(?:new file|deleted file) ') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
917 special_re = re.compile(b'(?:index|deleted|copy|rename|new mode) ') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
918 newfile_re = re.compile(b'(?:new file|copy to|rename to)') |
24261
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
919 |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
920 def __init__(self, header): |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
921 self.header = header |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
922 self.hunks = [] |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
923 |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
924 def binary(self): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
925 return any(h.startswith(b'index ') for h in self.header) |
24261
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
926 |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
927 def pretty(self, fp): |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
928 for h in self.header: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
929 if h.startswith(b'index '): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
930 fp.write(_(b'this modifies a binary file (all or nothing)\n')) |
24261
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
931 break |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
932 if self.pretty_re.match(h): |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
933 fp.write(h) |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
934 if self.binary(): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
935 fp.write(_(b'this is a binary file\n')) |
24261
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
936 break |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
937 if h.startswith(b'---'): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
938 fp.write( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
939 _(b'%d hunks, %d lines changed\n') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
940 % ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
941 len(self.hunks), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
942 sum([max(h.added, h.removed) for h in self.hunks]), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
943 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
944 ) |
24261
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
945 break |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
946 fp.write(h) |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
947 |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
948 def write(self, fp): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
949 fp.write(b''.join(self.header)) |
24261
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
950 |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
951 def allhunks(self): |
25149
3f0744eeaeaf
cleanup: use __builtins__.any instead of util.any
Augie Fackler <augie@google.com>
parents:
25138
diff
changeset
|
952 return any(self.allhunks_re.match(h) for h in self.header) |
24261
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
953 |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
954 def files(self): |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
955 match = self.diffgit_re.match(self.header[0]) |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
956 if match: |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
957 fromfile, tofile = match.groups() |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
958 if fromfile == tofile: |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
959 return [fromfile] |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
960 return [fromfile, tofile] |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
961 else: |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
962 return self.diff_re.match(self.header[0]).groups() |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
963 |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
964 def filename(self): |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
965 return self.files()[-1] |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
966 |
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
967 def __repr__(self): |
43943
0671f0a19d93
patch: fix header.__repr__() to not have `b''` prefixes in file names
Matt Harbison <matt_harbison@yahoo.com>
parents:
43906
diff
changeset
|
968 return '<header %s>' % ( |
0671f0a19d93
patch: fix header.__repr__() to not have `b''` prefixes in file names
Matt Harbison <matt_harbison@yahoo.com>
parents:
43906
diff
changeset
|
969 ' '.join(pycompat.rapply(pycompat.fsdecode, self.files())) |
0671f0a19d93
patch: fix header.__repr__() to not have `b''` prefixes in file names
Matt Harbison <matt_harbison@yahoo.com>
parents:
43906
diff
changeset
|
970 ) |
24261
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
971 |
24845
8133494accf1
record: edit patch of newly added files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents:
24837
diff
changeset
|
972 def isnewfile(self): |
25149
3f0744eeaeaf
cleanup: use __builtins__.any instead of util.any
Augie Fackler <augie@google.com>
parents:
25138
diff
changeset
|
973 return any(self.newfile_re.match(h) for h in self.header) |
24845
8133494accf1
record: edit patch of newly added files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents:
24837
diff
changeset
|
974 |
24261
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
975 def special(self): |
24845
8133494accf1
record: edit patch of newly added files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents:
24837
diff
changeset
|
976 # Special files are shown only at the header level and not at the hunk |
8133494accf1
record: edit patch of newly added files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents:
24837
diff
changeset
|
977 # level for example a file that has been deleted is a special file. |
8133494accf1
record: edit patch of newly added files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents:
24837
diff
changeset
|
978 # The user cannot change the content of the operation, in the case of |
8133494accf1
record: edit patch of newly added files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents:
24837
diff
changeset
|
979 # the deleted file he has to take the deletion or not take it, he |
8133494accf1
record: edit patch of newly added files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents:
24837
diff
changeset
|
980 # cannot take some of it. |
8133494accf1
record: edit patch of newly added files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents:
24837
diff
changeset
|
981 # Newly added files are special if they are empty, they are not special |
8133494accf1
record: edit patch of newly added files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents:
24837
diff
changeset
|
982 # if they have some content as we want to be able to change it |
8133494accf1
record: edit patch of newly added files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents:
24837
diff
changeset
|
983 nocontent = len(self.header) == 2 |
8133494accf1
record: edit patch of newly added files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents:
24837
diff
changeset
|
984 emptynewfile = self.isnewfile() and nocontent |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
985 return emptynewfile or any( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
986 self.special_re.match(h) for h in self.header |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
987 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
988 |
24261
20aac24e2114
record: move header class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24260
diff
changeset
|
989 |
24263
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
990 class recordhunk(object): |
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
991 """patch hunk |
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
992 |
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
993 XXX shouldn't we merge this with the other hunk class? |
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
994 """ |
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
995 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
996 def __init__( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
997 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
998 header, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
999 fromline, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1000 toline, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1001 proc, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1002 before, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1003 hunk, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1004 after, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1005 maxcontext=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1006 ): |
33270
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1007 def trimcontext(lines, reverse=False): |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1008 if maxcontext is not None: |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1009 delta = len(lines) - maxcontext |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1010 if delta > 0: |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1011 if reverse: |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1012 return delta, lines[delta:] |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1013 else: |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1014 return delta, lines[:maxcontext] |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1015 return 0, lines |
24263
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
1016 |
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
1017 self.header = header |
33270
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1018 trimedbefore, self.before = trimcontext(before, True) |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1019 self.fromline = fromline + trimedbefore |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1020 self.toline = toline + trimedbefore |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1021 _trimedafter, self.after = trimcontext(after, False) |
24263
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
1022 self.proc = proc |
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
1023 self.hunk = hunk |
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
1024 self.added, self.removed = self.countchanges(self.hunk) |
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
1025 |
24346
31edcea517c1
record: add comparison methods for recordhunk class
Laurent Charignon <lcharignon@fb.com>
parents:
24341
diff
changeset
|
1026 def __eq__(self, v): |
31edcea517c1
record: add comparison methods for recordhunk class
Laurent Charignon <lcharignon@fb.com>
parents:
24341
diff
changeset
|
1027 if not isinstance(v, recordhunk): |
31edcea517c1
record: add comparison methods for recordhunk class
Laurent Charignon <lcharignon@fb.com>
parents:
24341
diff
changeset
|
1028 return False |
31edcea517c1
record: add comparison methods for recordhunk class
Laurent Charignon <lcharignon@fb.com>
parents:
24341
diff
changeset
|
1029 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1030 return ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1031 (v.hunk == self.hunk) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1032 and (v.proc == self.proc) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1033 and (self.fromline == v.fromline) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1034 and (self.header.files() == v.header.files()) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1035 ) |
24346
31edcea517c1
record: add comparison methods for recordhunk class
Laurent Charignon <lcharignon@fb.com>
parents:
24341
diff
changeset
|
1036 |
31edcea517c1
record: add comparison methods for recordhunk class
Laurent Charignon <lcharignon@fb.com>
parents:
24341
diff
changeset
|
1037 def __hash__(self): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1038 return hash( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1039 ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1040 tuple(self.hunk), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1041 tuple(self.header.files()), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1042 self.fromline, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1043 self.proc, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1044 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1045 ) |
24346
31edcea517c1
record: add comparison methods for recordhunk class
Laurent Charignon <lcharignon@fb.com>
parents:
24341
diff
changeset
|
1046 |
24263
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
1047 def countchanges(self, hunk): |
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
1048 """hunk -> (n+,n-)""" |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1049 add = len([h for h in hunk if h.startswith(b'+')]) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1050 rem = len([h for h in hunk if h.startswith(b'-')]) |
24263
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
1051 return add, rem |
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
1052 |
32979
66117dae87f9
patch: rewrite reversehunks (issue5337)
Jun Wu <quark@fb.com>
parents:
32370
diff
changeset
|
1053 def reversehunk(self): |
66117dae87f9
patch: rewrite reversehunks (issue5337)
Jun Wu <quark@fb.com>
parents:
32370
diff
changeset
|
1054 """return another recordhunk which is the reverse of the hunk |
66117dae87f9
patch: rewrite reversehunks (issue5337)
Jun Wu <quark@fb.com>
parents:
32370
diff
changeset
|
1055 |
66117dae87f9
patch: rewrite reversehunks (issue5337)
Jun Wu <quark@fb.com>
parents:
32370
diff
changeset
|
1056 If this hunk is diff(A, B), the returned hunk is diff(B, A). To do |
66117dae87f9
patch: rewrite reversehunks (issue5337)
Jun Wu <quark@fb.com>
parents:
32370
diff
changeset
|
1057 that, swap fromline/toline and +/- signs while keep other things |
66117dae87f9
patch: rewrite reversehunks (issue5337)
Jun Wu <quark@fb.com>
parents:
32370
diff
changeset
|
1058 unchanged. |
66117dae87f9
patch: rewrite reversehunks (issue5337)
Jun Wu <quark@fb.com>
parents:
32370
diff
changeset
|
1059 """ |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1060 m = {b'+': b'-', b'-': b'+', b'\\': b'\\'} |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1061 hunk = [b'%s%s' % (m[l[0:1]], l[1:]) for l in self.hunk] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1062 return recordhunk( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1063 self.header, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1064 self.toline, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1065 self.fromline, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1066 self.proc, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1067 self.before, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1068 hunk, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1069 self.after, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1070 ) |
32979
66117dae87f9
patch: rewrite reversehunks (issue5337)
Jun Wu <quark@fb.com>
parents:
32370
diff
changeset
|
1071 |
24263
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
1072 def write(self, fp): |
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
1073 delta = len(self.before) + len(self.after) |
45154
10f48720ef95
diff: move no-eol text constant to a common location
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
45098
diff
changeset
|
1074 if self.after and self.after[-1] == diffhelper.MISSING_NEWLINE_MARKER: |
24263
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
1075 delta -= 1 |
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
1076 fromlen = delta + self.removed |
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
1077 tolen = delta + self.added |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1078 fp.write( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1079 b'@@ -%d,%d +%d,%d @@%s\n' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1080 % ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1081 self.fromline, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1082 fromlen, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1083 self.toline, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1084 tolen, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1085 self.proc and (b' ' + self.proc), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1086 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1087 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1088 fp.write(b''.join(self.before + self.hunk + self.after)) |
24263
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
1089 |
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
1090 pretty = write |
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
1091 |
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
1092 def filename(self): |
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
1093 return self.header.filename() |
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
1094 |
44247
c443b9ba6f63
py3: __repr__ needs to return str, not bytes
Kyle Lippincott <spectral@google.com>
parents:
44060
diff
changeset
|
1095 @encoding.strmethod |
24263
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
1096 def __repr__(self): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1097 return b'<hunk %r@%d>' % (self.filename(), self.fromline) |
24263
a45d1c51109e
record: move hunk class from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24261
diff
changeset
|
1098 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1099 |
34566
60213a2eca81
patch: do not cache translated messages (API)
Jun Wu <quark@fb.com>
parents:
34561
diff
changeset
|
1100 def getmessages(): |
60213a2eca81
patch: do not cache translated messages (API)
Jun Wu <quark@fb.com>
parents:
34561
diff
changeset
|
1101 return { |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1102 b'multiple': { |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1103 b'apply': _(b"apply change %d/%d to '%s'?"), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1104 b'discard': _(b"discard change %d/%d to '%s'?"), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1105 b'keep': _(b"keep change %d/%d to '%s'?"), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1106 b'record': _(b"record change %d/%d to '%s'?"), |
34566
60213a2eca81
patch: do not cache translated messages (API)
Jun Wu <quark@fb.com>
parents:
34561
diff
changeset
|
1107 }, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1108 b'single': { |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1109 b'apply': _(b"apply this change to '%s'?"), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1110 b'discard': _(b"discard this change to '%s'?"), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1111 b'keep': _(b"keep this change to '%s'?"), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1112 b'record': _(b"record this change to '%s'?"), |
34566
60213a2eca81
patch: do not cache translated messages (API)
Jun Wu <quark@fb.com>
parents:
34561
diff
changeset
|
1113 }, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1114 b'help': { |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1115 b'apply': _( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1116 b'[Ynesfdaq?]' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1117 b'$$ &Yes, apply this change' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1118 b'$$ &No, skip this change' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1119 b'$$ &Edit this change manually' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1120 b'$$ &Skip remaining changes to this file' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1121 b'$$ Apply remaining changes to this &file' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1122 b'$$ &Done, skip remaining changes and files' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1123 b'$$ Apply &all changes to all remaining files' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1124 b'$$ &Quit, applying no changes' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1125 b'$$ &? (display help)' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1126 ), |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1127 b'discard': _( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1128 b'[Ynesfdaq?]' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1129 b'$$ &Yes, discard this change' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1130 b'$$ &No, skip this change' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1131 b'$$ &Edit this change manually' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1132 b'$$ &Skip remaining changes to this file' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1133 b'$$ Discard remaining changes to this &file' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1134 b'$$ &Done, skip remaining changes and files' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1135 b'$$ Discard &all changes to all remaining files' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1136 b'$$ &Quit, discarding no changes' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1137 b'$$ &? (display help)' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1138 ), |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1139 b'keep': _( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1140 b'[Ynesfdaq?]' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1141 b'$$ &Yes, keep this change' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1142 b'$$ &No, skip this change' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1143 b'$$ &Edit this change manually' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1144 b'$$ &Skip remaining changes to this file' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1145 b'$$ Keep remaining changes to this &file' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1146 b'$$ &Done, skip remaining changes and files' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1147 b'$$ Keep &all changes to all remaining files' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1148 b'$$ &Quit, keeping all changes' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1149 b'$$ &? (display help)' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1150 ), |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1151 b'record': _( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1152 b'[Ynesfdaq?]' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1153 b'$$ &Yes, record this change' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1154 b'$$ &No, skip this change' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1155 b'$$ &Edit this change manually' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1156 b'$$ &Skip remaining changes to this file' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1157 b'$$ Record remaining changes to this &file' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1158 b'$$ &Done, skip remaining changes and files' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1159 b'$$ Record &all changes to all remaining files' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1160 b'$$ &Quit, recording no changes' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1161 b'$$ &? (display help)' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1162 ), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1163 }, |
34042
c0170d88ed2b
patch: take messages out of the function so that extensions can add entries
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34013
diff
changeset
|
1164 } |
c0170d88ed2b
patch: take messages out of the function so that extensions can add entries
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34013
diff
changeset
|
1165 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1166 |
42071
db72f9f6580e
interactive: do not prompt about files given in command line
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
41987
diff
changeset
|
1167 def filterpatch(ui, headers, match, operation=None): |
24269
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1168 """Interactively filter patch chunks into applied-only chunks""" |
34566
60213a2eca81
patch: do not cache translated messages (API)
Jun Wu <quark@fb.com>
parents:
34561
diff
changeset
|
1169 messages = getmessages() |
60213a2eca81
patch: do not cache translated messages (API)
Jun Wu <quark@fb.com>
parents:
34561
diff
changeset
|
1170 |
25359
724421cb4745
record: add default value for operation argument
Laurent Charignon <lcharignon@fb.com>
parents:
25310
diff
changeset
|
1171 if operation is None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1172 operation = b'record' |
24269
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1173 |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1174 def prompt(skipfile, skipall, query, chunk): |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1175 """prompt query, and process base inputs |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1176 |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1177 - y/n for the rest of file |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1178 - y/n for the rest |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1179 - ? (help) |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1180 - q (quit) |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1181 |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1182 Return True/False and possibly updated skipfile and skipall. |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1183 """ |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1184 newpatches = None |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1185 if skipall is not None: |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1186 return skipall, skipfile, skipall, newpatches |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1187 if skipfile is not None: |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1188 return skipfile, skipfile, skipall, newpatches |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1189 while True: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1190 resps = messages[b'help'][operation] |
42566
f802a75da585
patch: use a short, fixed-size message for last line of prompt (issue6158)
Kyle Lippincott <spectral@google.com>
parents:
42071
diff
changeset
|
1191 # IMPORTANT: keep the last line of this prompt short (<40 english |
f802a75da585
patch: use a short, fixed-size message for last line of prompt (issue6158)
Kyle Lippincott <spectral@google.com>
parents:
42071
diff
changeset
|
1192 # chars is a good target) because of issue6158. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1193 r = ui.promptchoice(b"%s\n(enter ? for help) %s" % (query, resps)) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1194 ui.write(b"\n") |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1195 if r == 8: # ? |
24269
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1196 for c, t in ui.extractchoices(resps)[1]: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1197 ui.write(b'%s - %s\n' % (c, encoding.lower(t))) |
24269
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1198 continue |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1199 elif r == 0: # yes |
24269
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1200 ret = True |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1201 elif r == 1: # no |
24269
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1202 ret = False |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1203 elif r == 2: # Edit patch |
24269
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1204 if chunk is None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1205 ui.write(_(b'cannot edit patch for whole file')) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1206 ui.write(b"\n") |
24269
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1207 continue |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1208 if chunk.header.binary(): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1209 ui.write(_(b'cannot edit patch for binary file')) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1210 ui.write(b"\n") |
24269
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1211 continue |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1212 # Patch comment based on the Git one (based on comment at end of |
26421
4b0fc75f9403
urls: bulk-change primary website URLs
Matt Mackall <mpm@selenic.com>
parents:
25660
diff
changeset
|
1213 # https://mercurial-scm.org/wiki/RecordExtension) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1214 phelp = b'---' + _( |
46693
5f86765c9707
patch: convert a UI message to bytes when editing a patch
Matt Harbison <matt_harbison@yahoo.com>
parents:
46550
diff
changeset
|
1215 b""" |
24269
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1216 To remove '-' lines, make them ' ' lines (context). |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1217 To remove '+' lines, delete them. |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1218 Lines starting with # will be removed from the patch. |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1219 |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1220 If the patch applies cleanly, the edited hunk will immediately be |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1221 added to the record list. If it does not apply cleanly, a rejects |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1222 file will be generated: you can use that when you try again. If |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1223 all lines of the hunk are removed, then the edit is aborted and |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1224 the hunk is left unchanged. |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1225 """ |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1226 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1227 (patchfd, patchfn) = pycompat.mkstemp( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1228 prefix=b"hg-editor-", suffix=b".diff" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1229 ) |
24269
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1230 ncpatchfp = None |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1231 try: |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1232 # Write the initial patch |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
1233 f = util.nativeeolwriter(os.fdopen(patchfd, 'wb')) |
24269
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1234 chunk.header.write(f) |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1235 chunk.write(f) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1236 f.write( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1237 b''.join( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1238 [b'# ' + i + b'\n' for i in phelp.splitlines()] |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1239 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1240 ) |
24269
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1241 f.close() |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1242 # Start the editor and wait for it to complete |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1243 editor = ui.geteditor() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1244 ret = ui.system( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1245 b"%s \"%s\"" % (editor, patchfn), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1246 environ={b'HGUSER': ui.username()}, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1247 blockedtag=b'filterpatch', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1248 ) |
25483
fb04372d7b38
record: exiting editor with non-zero status should not stop recording session
Laurent Charignon <lcharignon@fb.com>
parents:
25424
diff
changeset
|
1249 if ret != 0: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1250 ui.warn(_(b"editor exited with exit code %d\n") % ret) |
25483
fb04372d7b38
record: exiting editor with non-zero status should not stop recording session
Laurent Charignon <lcharignon@fb.com>
parents:
25424
diff
changeset
|
1251 continue |
24269
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1252 # Remove comment lines |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
1253 patchfp = open(patchfn, 'rb') |
28861
86db5cb55d46
pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents:
28341
diff
changeset
|
1254 ncpatchfp = stringio() |
30397 | 1255 for line in util.iterfile(patchfp): |
36838
c268ba15deb3
py3: open patch file in binary mode and convert eol manually
Yuya Nishihara <yuya@tcha.org>
parents:
36837
diff
changeset
|
1256 line = util.fromnativeeol(line) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1257 if not line.startswith(b'#'): |
24269
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1258 ncpatchfp.write(line) |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1259 patchfp.close() |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1260 ncpatchfp.seek(0) |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1261 newpatches = parsepatch(ncpatchfp) |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1262 finally: |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1263 os.unlink(patchfn) |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1264 del ncpatchfp |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1265 # Signal that the chunk shouldn't be applied as-is, but |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1266 # provide the new patch to be used instead. |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1267 ret = False |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1268 elif r == 3: # Skip |
24269
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1269 ret = skipfile = False |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1270 elif r == 4: # file (Record remaining) |
24269
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1271 ret = skipfile = True |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1272 elif r == 5: # done, skip remaining |
24269
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1273 ret = skipall = False |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1274 elif r == 6: # all |
24269
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1275 ret = skipall = True |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1276 elif r == 7: # quit |
45877
ac362d5a7893
errors: introduce CanceledError and use it in a few places
Martin von Zweigbergk <martinvonz@google.com>
parents:
45154
diff
changeset
|
1277 raise error.CanceledError(_(b'user quit')) |
24269
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1278 return ret, skipfile, skipall, newpatches |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1279 |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1280 seen = set() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1281 applied = {} # 'filename' -> [] of chunks |
24269
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1282 skipfile, skipall = None, None |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1283 pos, total = 1, sum(len(h.hunks) for h in headers) |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1284 for h in headers: |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1285 pos += len(h.hunks) |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1286 skipfile = None |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1287 fixoffset = 0 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1288 hdr = b''.join(h.header) |
24269
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1289 if hdr in seen: |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1290 continue |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1291 seen.add(hdr) |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1292 if skipall is None: |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1293 h.pretty(ui) |
42071
db72f9f6580e
interactive: do not prompt about files given in command line
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
41987
diff
changeset
|
1294 files = h.files() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1295 msg = _(b'examine changes to %s?') % _(b' and ').join( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1296 b"'%s'" % f for f in files |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1297 ) |
42071
db72f9f6580e
interactive: do not prompt about files given in command line
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
41987
diff
changeset
|
1298 if all(match.exact(f) for f in files): |
db72f9f6580e
interactive: do not prompt about files given in command line
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
41987
diff
changeset
|
1299 r, skipall, np = True, None, None |
db72f9f6580e
interactive: do not prompt about files given in command line
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
41987
diff
changeset
|
1300 else: |
db72f9f6580e
interactive: do not prompt about files given in command line
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
41987
diff
changeset
|
1301 r, skipfile, skipall, np = prompt(skipfile, skipall, msg, None) |
24269
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1302 if not r: |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1303 continue |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1304 applied[h.filename()] = [h] |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1305 if h.allhunks(): |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1306 applied[h.filename()] += h.hunks |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1307 continue |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1308 for i, chunk in enumerate(h.hunks): |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1309 if skipfile is None and skipall is None: |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1310 chunk.pretty(ui) |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1311 if total == 1: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1312 msg = messages[b'single'][operation] % chunk.filename() |
24269
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1313 else: |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1314 idx = pos - len(h.hunks) + i |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1315 msg = messages[b'multiple'][operation] % ( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1316 idx, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1317 total, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1318 chunk.filename(), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1319 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1320 r, skipfile, skipall, newpatches = prompt( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1321 skipfile, skipall, msg, chunk |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1322 ) |
24269
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1323 if r: |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1324 if fixoffset: |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1325 chunk = copy.copy(chunk) |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1326 chunk.toline += fixoffset |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1327 applied[chunk.filename()].append(chunk) |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1328 elif newpatches is not None: |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1329 for newpatch in newpatches: |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1330 for newhunk in newpatch.hunks: |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1331 if fixoffset: |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1332 newhunk.toline += fixoffset |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1333 applied[newhunk.filename()].append(newhunk) |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1334 else: |
9a745ced79a9
record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24268
diff
changeset
|
1335 fixoffset += chunk.removed - chunk.added |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1336 return ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1337 sum( |
43104
74802979dd9d
py3: define and use pycompat.itervalues()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43097
diff
changeset
|
1338 [ |
74802979dd9d
py3: define and use pycompat.itervalues()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43097
diff
changeset
|
1339 h |
74802979dd9d
py3: define and use pycompat.itervalues()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43097
diff
changeset
|
1340 for h in pycompat.itervalues(applied) |
74802979dd9d
py3: define and use pycompat.itervalues()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43097
diff
changeset
|
1341 if h[0].special() or len(h) > 1 |
74802979dd9d
py3: define and use pycompat.itervalues()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43097
diff
changeset
|
1342 ], |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1343 [], |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1344 ), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1345 {}, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1346 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1347 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1348 |
8778
c5f36402daad
use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8761
diff
changeset
|
1349 class hunk(object): |
14451
c78d41db6f88
patch: refactor file creation/removal detection
Patrick Mezard <pmezard@gmail.com>
parents:
14437
diff
changeset
|
1350 def __init__(self, desc, num, lr, context): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1351 self.number = num |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1352 self.desc = desc |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1353 self.hunk = [desc] |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1354 self.a = [] |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1355 self.b = [] |
9682
bd70f645cfb0
patch: initialize all attributes of the hunk class
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9681
diff
changeset
|
1356 self.starta = self.lena = None |
bd70f645cfb0
patch: initialize all attributes of the hunk class
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9681
diff
changeset
|
1357 self.startb = self.lenb = None |
10127
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
1358 if lr is not None: |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
1359 if context: |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
1360 self.read_context_hunk(lr) |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
1361 else: |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
1362 self.read_unified_hunk(lr) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1363 |
10127
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
1364 def getnormalized(self): |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
1365 """Return a copy with line endings normalized to LF.""" |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
1366 |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
1367 def normalize(lines): |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
1368 nlines = [] |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
1369 for line in lines: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1370 if line.endswith(b'\r\n'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1371 line = line[:-2] + b'\n' |
10127
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
1372 nlines.append(line) |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
1373 return nlines |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
1374 |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
1375 # Dummy object, it is rebuilt manually |
14451
c78d41db6f88
patch: refactor file creation/removal detection
Patrick Mezard <pmezard@gmail.com>
parents:
14437
diff
changeset
|
1376 nh = hunk(self.desc, self.number, None, None) |
10127
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
1377 nh.number = self.number |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
1378 nh.desc = self.desc |
10524
3212afb33116
patch: fix patching with fuzz and eol normalization
Patrick Mezard <pmezard@gmail.com>
parents:
10518
diff
changeset
|
1379 nh.hunk = self.hunk |
10127
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
1380 nh.a = normalize(self.a) |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
1381 nh.b = normalize(self.b) |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
1382 nh.starta = self.starta |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
1383 nh.startb = self.startb |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
1384 nh.lena = self.lena |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
1385 nh.lenb = self.lenb |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
1386 return nh |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
1387 |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1388 def read_unified_hunk(self, lr): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1389 m = unidesc.match(self.desc) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1390 if not m: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1391 raise PatchError(_(b"bad hunk #%d") % self.number) |
15510
5414b56cfad6
patch: simplify hunk extents parsing
Patrick Mezard <pmezard@gmail.com>
parents:
15462
diff
changeset
|
1392 self.starta, self.lena, self.startb, self.lenb = m.groups() |
8527
f9a80054dd3c
use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents:
8526
diff
changeset
|
1393 if self.lena is None: |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1394 self.lena = 1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1395 else: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1396 self.lena = int(self.lena) |
8527
f9a80054dd3c
use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents:
8526
diff
changeset
|
1397 if self.lenb is None: |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1398 self.lenb = 1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1399 else: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1400 self.lenb = int(self.lenb) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1401 self.starta = int(self.starta) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1402 self.startb = int(self.startb) |
37573
49b82cdb5983
patch: error out if reached to EOF while reading hunk
Yuya Nishihara <yuya@tcha.org>
parents:
37571
diff
changeset
|
1403 try: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1404 diffhelper.addlines( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1405 lr, self.hunk, self.lena, self.lenb, self.a, self.b |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1406 ) |
37573
49b82cdb5983
patch: error out if reached to EOF while reading hunk
Yuya Nishihara <yuya@tcha.org>
parents:
37571
diff
changeset
|
1407 except error.ParseError as e: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1408 raise PatchError(_(b"bad hunk #%d: %s") % (self.number, e)) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1409 # if we hit eof before finishing out the hunk, the last line will |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1410 # be zero length. Lets try to fix it up. |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1411 while len(self.hunk[-1]) == 0: |
6948
359e93ceee3a
fix double indentation and trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
1412 del self.hunk[-1] |
359e93ceee3a
fix double indentation and trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
1413 del self.a[-1] |
359e93ceee3a
fix double indentation and trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
1414 del self.b[-1] |
359e93ceee3a
fix double indentation and trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
1415 self.lena -= 1 |
359e93ceee3a
fix double indentation and trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
1416 self.lenb -= 1 |
13699
d3c0e0033f13
patch: fix hunk newlines when parsing hunks, not in iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
13395
diff
changeset
|
1417 self._fixnewline(lr) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1418 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1419 def read_context_hunk(self, lr): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1420 self.desc = lr.readline() |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1421 m = contextdesc.match(self.desc) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1422 if not m: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1423 raise PatchError(_(b"bad hunk #%d") % self.number) |
15510
5414b56cfad6
patch: simplify hunk extents parsing
Patrick Mezard <pmezard@gmail.com>
parents:
15462
diff
changeset
|
1424 self.starta, aend = m.groups() |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1425 self.starta = int(self.starta) |
8527
f9a80054dd3c
use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents:
8526
diff
changeset
|
1426 if aend is None: |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1427 aend = self.starta |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1428 self.lena = int(aend) - self.starta |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1429 if self.starta: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1430 self.lena += 1 |
38783
e7aa113b14f7
global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38773
diff
changeset
|
1431 for x in pycompat.xrange(self.lena): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1432 l = lr.readline() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1433 if l.startswith(b'---'): |
12825
61f48581d8ef
Test applying context diffs
Patrick Mezard <pmezard@gmail.com>
parents:
12728
diff
changeset
|
1434 # lines addition, old block is empty |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1435 lr.push(l) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1436 break |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1437 s = l[2:] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1438 if l.startswith(b'- ') or l.startswith(b'! '): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1439 u = b'-' + s |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1440 elif l.startswith(b' '): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1441 u = b' ' + s |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1442 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1443 raise PatchError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1444 _(b"bad hunk #%d old text line %d") % (self.number, x) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1445 ) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1446 self.a.append(u) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1447 self.hunk.append(u) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1448 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1449 l = lr.readline() |
41534
47c92f8ed128
patch: properly escape \ in string literals
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41532
diff
changeset
|
1450 if l.startswith(br'\ '): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1451 s = self.a[-1][:-1] |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1452 self.a[-1] = s |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1453 self.hunk[-1] = s |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1454 l = lr.readline() |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1455 m = contextdesc.match(l) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1456 if not m: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1457 raise PatchError(_(b"bad hunk #%d") % self.number) |
15510
5414b56cfad6
patch: simplify hunk extents parsing
Patrick Mezard <pmezard@gmail.com>
parents:
15462
diff
changeset
|
1458 self.startb, bend = m.groups() |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1459 self.startb = int(self.startb) |
8527
f9a80054dd3c
use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents:
8526
diff
changeset
|
1460 if bend is None: |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1461 bend = self.startb |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1462 self.lenb = int(bend) - self.startb |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1463 if self.startb: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1464 self.lenb += 1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1465 hunki = 1 |
38783
e7aa113b14f7
global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38773
diff
changeset
|
1466 for x in pycompat.xrange(self.lenb): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1467 l = lr.readline() |
41534
47c92f8ed128
patch: properly escape \ in string literals
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41532
diff
changeset
|
1468 if l.startswith(br'\ '): |
12825
61f48581d8ef
Test applying context diffs
Patrick Mezard <pmezard@gmail.com>
parents:
12728
diff
changeset
|
1469 # XXX: the only way to hit this is with an invalid line range. |
61f48581d8ef
Test applying context diffs
Patrick Mezard <pmezard@gmail.com>
parents:
12728
diff
changeset
|
1470 # The no-eol marker is not counted in the line range, but I |
61f48581d8ef
Test applying context diffs
Patrick Mezard <pmezard@gmail.com>
parents:
12728
diff
changeset
|
1471 # guess there are diff(1) out there which behave differently. |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1472 s = self.b[-1][:-1] |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1473 self.b[-1] = s |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1474 self.hunk[hunki - 1] = s |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1475 continue |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1476 if not l: |
12825
61f48581d8ef
Test applying context diffs
Patrick Mezard <pmezard@gmail.com>
parents:
12728
diff
changeset
|
1477 # line deletions, new block is empty and we hit EOF |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1478 lr.push(l) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1479 break |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1480 s = l[2:] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1481 if l.startswith(b'+ ') or l.startswith(b'! '): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1482 u = b'+' + s |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1483 elif l.startswith(b' '): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1484 u = b' ' + s |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1485 elif len(self.b) == 0: |
12825
61f48581d8ef
Test applying context diffs
Patrick Mezard <pmezard@gmail.com>
parents:
12728
diff
changeset
|
1486 # line deletions, new block is empty |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1487 lr.push(l) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1488 break |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1489 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1490 raise PatchError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1491 _(b"bad hunk #%d old text line %d") % (self.number, x) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1492 ) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1493 self.b.append(s) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1494 while True: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1495 if hunki >= len(self.hunk): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1496 h = b"" |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1497 else: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1498 h = self.hunk[hunki] |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1499 hunki += 1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1500 if h == u: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1501 break |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1502 elif h.startswith(b'-'): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1503 continue |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1504 else: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1505 self.hunk.insert(hunki - 1, u) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1506 break |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1507 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1508 if not self.a: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1509 # this happens when lines were only added to the hunk |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1510 for x in self.hunk: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1511 if x.startswith(b'-') or x.startswith(b' '): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1512 self.a.append(x) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1513 if not self.b: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1514 # this happens when lines were only deleted from the hunk |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1515 for x in self.hunk: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1516 if x.startswith(b'+') or x.startswith(b' '): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1517 self.b.append(x[1:]) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1518 # @@ -start,len +start,len @@ |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1519 self.desc = b"@@ -%d,%d +%d,%d @@\n" % ( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1520 self.starta, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1521 self.lena, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1522 self.startb, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1523 self.lenb, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1524 ) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1525 self.hunk[0] = self.desc |
13699
d3c0e0033f13
patch: fix hunk newlines when parsing hunks, not in iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
13395
diff
changeset
|
1526 self._fixnewline(lr) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1527 |
13699
d3c0e0033f13
patch: fix hunk newlines when parsing hunks, not in iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
13395
diff
changeset
|
1528 def _fixnewline(self, lr): |
d3c0e0033f13
patch: fix hunk newlines when parsing hunks, not in iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
13395
diff
changeset
|
1529 l = lr.readline() |
41534
47c92f8ed128
patch: properly escape \ in string literals
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41532
diff
changeset
|
1530 if l.startswith(br'\ '): |
37803
72f6498c040b
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)
Yuya Nishihara <yuya@tcha.org>
parents:
37764
diff
changeset
|
1531 diffhelper.fixnewline(self.hunk, self.a, self.b) |
13699
d3c0e0033f13
patch: fix hunk newlines when parsing hunks, not in iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
13395
diff
changeset
|
1532 else: |
d3c0e0033f13
patch: fix hunk newlines when parsing hunks, not in iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
13395
diff
changeset
|
1533 lr.push(l) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1534 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1535 def complete(self): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1536 return len(self.a) == self.lena and len(self.b) == self.lenb |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1537 |
16121
ccba74472af2
patch: fuzz old and new lines at the same time
Patrick Mezard <patrick@mezard.eu>
parents:
16112
diff
changeset
|
1538 def _fuzzit(self, old, new, fuzz, toponly): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1539 # this removes context lines from the top and bottom of list 'l'. It |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1540 # checks the hunk to make sure only context lines are removed, and then |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1541 # returns a new shortened list of lines. |
16124
0e0060bf2f44
patch: fuzz more aggressively to match patch(1) behaviour
Patrick Mezard <patrick@mezard.eu>
parents:
16123
diff
changeset
|
1542 fuzz = min(fuzz, len(old)) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1543 if fuzz: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1544 top = 0 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1545 bot = 0 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1546 hlen = len(self.hunk) |
38783
e7aa113b14f7
global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38773
diff
changeset
|
1547 for x in pycompat.xrange(hlen - 1): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1548 # the hunk starts with the @@ line, so use x+1 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1549 if self.hunk[x + 1].startswith(b' '): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1550 top += 1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1551 else: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1552 break |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1553 if not toponly: |
38783
e7aa113b14f7
global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38773
diff
changeset
|
1554 for x in pycompat.xrange(hlen - 1): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1555 if self.hunk[hlen - bot - 1].startswith(b' '): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1556 bot += 1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1557 else: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1558 break |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1559 |
16124
0e0060bf2f44
patch: fuzz more aggressively to match patch(1) behaviour
Patrick Mezard <patrick@mezard.eu>
parents:
16123
diff
changeset
|
1560 bot = min(fuzz, bot) |
0e0060bf2f44
patch: fuzz more aggressively to match patch(1) behaviour
Patrick Mezard <patrick@mezard.eu>
parents:
16123
diff
changeset
|
1561 top = min(fuzz, top) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1562 return old[top : len(old) - bot], new[top : len(new) - bot], top |
16122
9ef3a4a2c6c0
patch: make hunk.fuzzit() compute the fuzzed start locations
Patrick Mezard <patrick@mezard.eu>
parents:
16121
diff
changeset
|
1563 return old, new, 0 |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1564 |
16121
ccba74472af2
patch: fuzz old and new lines at the same time
Patrick Mezard <patrick@mezard.eu>
parents:
16112
diff
changeset
|
1565 def fuzzit(self, fuzz, toponly): |
16122
9ef3a4a2c6c0
patch: make hunk.fuzzit() compute the fuzzed start locations
Patrick Mezard <patrick@mezard.eu>
parents:
16121
diff
changeset
|
1566 old, new, top = self._fuzzit(self.a, self.b, fuzz, toponly) |
9ef3a4a2c6c0
patch: make hunk.fuzzit() compute the fuzzed start locations
Patrick Mezard <patrick@mezard.eu>
parents:
16121
diff
changeset
|
1567 oldstart = self.starta + top |
9ef3a4a2c6c0
patch: make hunk.fuzzit() compute the fuzzed start locations
Patrick Mezard <patrick@mezard.eu>
parents:
16121
diff
changeset
|
1568 newstart = self.startb + top |
9ef3a4a2c6c0
patch: make hunk.fuzzit() compute the fuzzed start locations
Patrick Mezard <patrick@mezard.eu>
parents:
16121
diff
changeset
|
1569 # zero length hunk ranges already have their start decremented |
16650
fcb97d9a26cd
patch: fix segfault against unified diffs which start line is zero
Yuya Nishihara <yuya@tcha.org>
parents:
16524
diff
changeset
|
1570 if self.lena and oldstart > 0: |
16122
9ef3a4a2c6c0
patch: make hunk.fuzzit() compute the fuzzed start locations
Patrick Mezard <patrick@mezard.eu>
parents:
16121
diff
changeset
|
1571 oldstart -= 1 |
16650
fcb97d9a26cd
patch: fix segfault against unified diffs which start line is zero
Yuya Nishihara <yuya@tcha.org>
parents:
16524
diff
changeset
|
1572 if self.lenb and newstart > 0: |
16122
9ef3a4a2c6c0
patch: make hunk.fuzzit() compute the fuzzed start locations
Patrick Mezard <patrick@mezard.eu>
parents:
16121
diff
changeset
|
1573 newstart -= 1 |
9ef3a4a2c6c0
patch: make hunk.fuzzit() compute the fuzzed start locations
Patrick Mezard <patrick@mezard.eu>
parents:
16121
diff
changeset
|
1574 return old, oldstart, new, newstart |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1575 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1576 |
14764
a7d5816087a9
classes: fix class style problems found by b071cd58af50
Thomas Arendsen Hein <thomas@intevation.de>
parents:
14695
diff
changeset
|
1577 class binhunk(object): |
43787
be8552f25cab
cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents:
43735
diff
changeset
|
1578 """A binary patch file.""" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1579 |
16523
727068417b95
patch: include file name in binary patch error messages
Patrick Mezard <patrick@mezard.eu>
parents:
16522
diff
changeset
|
1580 def __init__(self, lr, fname): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1581 self.text = None |
20137
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
1582 self.delta = False |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1583 self.hunk = [b'GIT binary patch\n'] |
16523
727068417b95
patch: include file name in binary patch error messages
Patrick Mezard <patrick@mezard.eu>
parents:
16522
diff
changeset
|
1584 self._fname = fname |
14384
9d59c596eb9e
patch: construct and parse binary hunks at the same time
Patrick Mezard <pmezard@gmail.com>
parents:
14383
diff
changeset
|
1585 self._read(lr) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1586 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1587 def complete(self): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1588 return self.text is not None |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1589 |
20137
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
1590 def new(self, lines): |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
1591 if self.delta: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1592 return [applybindelta(self.text, b''.join(lines))] |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1593 return [self.text] |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1594 |
14384
9d59c596eb9e
patch: construct and parse binary hunks at the same time
Patrick Mezard <pmezard@gmail.com>
parents:
14383
diff
changeset
|
1595 def _read(self, lr): |
16524
ed6a74312176
patch: be more tolerant with EOLs in binary diffs (issue2870)
Patrick Mezard <patrick@mezard.eu>
parents:
16523
diff
changeset
|
1596 def getline(lr, hunk): |
ed6a74312176
patch: be more tolerant with EOLs in binary diffs (issue2870)
Patrick Mezard <patrick@mezard.eu>
parents:
16523
diff
changeset
|
1597 l = lr.readline() |
ed6a74312176
patch: be more tolerant with EOLs in binary diffs (issue2870)
Patrick Mezard <patrick@mezard.eu>
parents:
16523
diff
changeset
|
1598 hunk.append(l) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1599 return l.rstrip(b'\r\n') |
16524
ed6a74312176
patch: be more tolerant with EOLs in binary diffs (issue2870)
Patrick Mezard <patrick@mezard.eu>
parents:
16523
diff
changeset
|
1600 |
16567
aef3d0d4631c
patch: clarify binary hunk parsing loop
Patrick Mezard <patrick@mezard.eu>
parents:
16524
diff
changeset
|
1601 while True: |
16524
ed6a74312176
patch: be more tolerant with EOLs in binary diffs (issue2870)
Patrick Mezard <patrick@mezard.eu>
parents:
16523
diff
changeset
|
1602 line = getline(lr, self.hunk) |
16567
aef3d0d4631c
patch: clarify binary hunk parsing loop
Patrick Mezard <patrick@mezard.eu>
parents:
16524
diff
changeset
|
1603 if not line: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1604 raise PatchError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1605 _(b'could not extract "%s" binary data') % self._fname |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1606 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1607 if line.startswith(b'literal '): |
20137
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
1608 size = int(line[8:].rstrip()) |
16567
aef3d0d4631c
patch: clarify binary hunk parsing loop
Patrick Mezard <patrick@mezard.eu>
parents:
16524
diff
changeset
|
1609 break |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1610 if line.startswith(b'delta '): |
20137
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
1611 size = int(line[6:].rstrip()) |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
1612 self.delta = True |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
1613 break |
3367
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
1614 dec = [] |
16524
ed6a74312176
patch: be more tolerant with EOLs in binary diffs (issue2870)
Patrick Mezard <patrick@mezard.eu>
parents:
16523
diff
changeset
|
1615 line = getline(lr, self.hunk) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1616 while len(line) > 1: |
36192
eb91ffdaaece
py3: slice over bytes to prevent getting ascii values
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36046
diff
changeset
|
1617 l = line[0:1] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1618 if l <= b'Z' and l >= b'A': |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1619 l = ord(l) - ord(b'A') + 1 |
3374
fd43ff3b4442
Use line length field when extracting git binary patches
Brendan Cully <brendan@kublai.com>
parents:
3367
diff
changeset
|
1620 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1621 l = ord(l) - ord(b'a') + 27 |
16522
a8065323c003
patch: display a nice error for invalid base85 data
Patrick Mezard <patrick@mezard.eu>
parents:
16506
diff
changeset
|
1622 try: |
32201
4462a981e8df
base85: proxy through util module
Yuya Nishihara <yuya@tcha.org>
parents:
32191
diff
changeset
|
1623 dec.append(util.b85decode(line[1:])[:l]) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25658
diff
changeset
|
1624 except ValueError as e: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1625 raise PatchError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1626 _(b'could not decode "%s" binary patch: %s') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1627 % (self._fname, stringutil.forcebytestr(e)) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1628 ) |
16524
ed6a74312176
patch: be more tolerant with EOLs in binary diffs (issue2870)
Patrick Mezard <patrick@mezard.eu>
parents:
16523
diff
changeset
|
1629 line = getline(lr, self.hunk) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1630 text = zlib.decompress(b''.join(dec)) |
3367
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
1631 if len(text) != size: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1632 raise PatchError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1633 _(b'"%s" length is %d bytes, should be %d') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1634 % (self._fname, len(text), size) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1635 ) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1636 self.text = text |
3367
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
1637 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1638 |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1639 def parsefilename(str): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1640 # --- filename \t|space stuff |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1641 s = str[4:].rstrip(b'\r\n') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1642 i = s.find(b'\t') |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1643 if i < 0: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1644 i = s.find(b' ') |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1645 if i < 0: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1646 return s |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1647 return s[:i] |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
1648 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1649 |
25424
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1650 def reversehunks(hunks): |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1651 '''reverse the signs in the hunks given as argument |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1652 |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1653 This function operates on hunks coming out of patch.filterpatch, that is |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1654 a list of the form: [header1, hunk1, hunk2, header2...]. Example usage: |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1655 |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34067
diff
changeset
|
1656 >>> rawpatch = b"""diff --git a/folder1/g b/folder1/g |
25424
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1657 ... --- a/folder1/g |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1658 ... +++ b/folder1/g |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1659 ... @@ -1,7 +1,7 @@ |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1660 ... +firstline |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1661 ... c |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1662 ... 1 |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1663 ... 2 |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1664 ... + 3 |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1665 ... -4 |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1666 ... 5 |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1667 ... d |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1668 ... +lastline""" |
34253
5ce32fe7df34
py3: fix doctests in patch.py to be compatible with Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34252
diff
changeset
|
1669 >>> hunks = parsepatch([rawpatch]) |
25424
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1670 >>> hunkscomingfromfilterpatch = [] |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1671 >>> for h in hunks: |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1672 ... hunkscomingfromfilterpatch.append(h) |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1673 ... hunkscomingfromfilterpatch.extend(h.hunks) |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1674 |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1675 >>> reversedhunks = reversehunks(hunkscomingfromfilterpatch) |
28861
86db5cb55d46
pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents:
28341
diff
changeset
|
1676 >>> from . import util |
86db5cb55d46
pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents:
28341
diff
changeset
|
1677 >>> fp = util.stringio() |
25424
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1678 >>> for c in reversedhunks: |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1679 ... c.write(fp) |
34253
5ce32fe7df34
py3: fix doctests in patch.py to be compatible with Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34252
diff
changeset
|
1680 >>> fp.seek(0) or None |
25424
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1681 >>> reversedpatch = fp.read() |
34137
a8994d08e4a2
doctest: use print_function and convert bytes to unicode where needed
Yuya Nishihara <yuya@tcha.org>
parents:
34131
diff
changeset
|
1682 >>> print(pycompat.sysstr(reversedpatch)) |
25424
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1683 diff --git a/folder1/g b/folder1/g |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1684 --- a/folder1/g |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1685 +++ b/folder1/g |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1686 @@ -1,4 +1,3 @@ |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1687 -firstline |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1688 c |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1689 1 |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1690 2 |
32979
66117dae87f9
patch: rewrite reversehunks (issue5337)
Jun Wu <quark@fb.com>
parents:
32370
diff
changeset
|
1691 @@ -2,6 +1,6 @@ |
25424
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1692 c |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1693 1 |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1694 2 |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1695 - 3 |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1696 +4 |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1697 5 |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1698 d |
32979
66117dae87f9
patch: rewrite reversehunks (issue5337)
Jun Wu <quark@fb.com>
parents:
32370
diff
changeset
|
1699 @@ -6,3 +5,2 @@ |
25424
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1700 5 |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1701 d |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1702 -lastline |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1703 |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1704 ''' |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1705 |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1706 newhunks = [] |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1707 for c in hunks: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1708 if util.safehasattr(c, b'reversehunk'): |
32979
66117dae87f9
patch: rewrite reversehunks (issue5337)
Jun Wu <quark@fb.com>
parents:
32370
diff
changeset
|
1709 c = c.reversehunk() |
25424
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1710 newhunks.append(c) |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1711 return newhunks |
69609f43c752
revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1712 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1713 |
33270
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1714 def parsepatch(originalchunks, maxcontext=None): |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1715 """patch -> [] of headers -> [] of hunks |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1716 |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1717 If maxcontext is not None, trim context lines if necessary. |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1718 |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34067
diff
changeset
|
1719 >>> rawpatch = b'''diff --git a/folder1/g b/folder1/g |
33270
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1720 ... --- a/folder1/g |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1721 ... +++ b/folder1/g |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1722 ... @@ -1,8 +1,10 @@ |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1723 ... 1 |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1724 ... 2 |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1725 ... -3 |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1726 ... 4 |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1727 ... 5 |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1728 ... 6 |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1729 ... +6.1 |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1730 ... +6.2 |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1731 ... 7 |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1732 ... 8 |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1733 ... +9''' |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1734 >>> out = util.stringio() |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1735 >>> headers = parsepatch([rawpatch], maxcontext=1) |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1736 >>> for header in headers: |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1737 ... header.write(out) |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1738 ... for hunk in header.hunks: |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1739 ... hunk.write(out) |
34137
a8994d08e4a2
doctest: use print_function and convert bytes to unicode where needed
Yuya Nishihara <yuya@tcha.org>
parents:
34131
diff
changeset
|
1740 >>> print(pycompat.sysstr(out.getvalue())) |
33270
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1741 diff --git a/folder1/g b/folder1/g |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1742 --- a/folder1/g |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1743 +++ b/folder1/g |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1744 @@ -2,3 +2,2 @@ |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1745 2 |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1746 -3 |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1747 4 |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1748 @@ -6,2 +5,4 @@ |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1749 6 |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1750 +6.1 |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1751 +6.2 |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1752 7 |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1753 @@ -8,1 +9,2 @@ |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1754 8 |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1755 +9 |
f7b635716ef2
patch: make parsepatch optionally trim context lines
Jun Wu <quark@fb.com>
parents:
33229
diff
changeset
|
1756 """ |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1757 |
24265
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1758 class parser(object): |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1759 """patch parsing state machine""" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1760 |
24265
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1761 def __init__(self): |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1762 self.fromline = 0 |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1763 self.toline = 0 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1764 self.proc = b'' |
24265
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1765 self.header = None |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1766 self.context = [] |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1767 self.before = [] |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1768 self.hunk = [] |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1769 self.headers = [] |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1770 |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1771 def addrange(self, limits): |
41454
d1d3094b54f9
patch: handle 0 context lines (diff.unified=0) when parsing patches
Kyle Lippincott <spectral@google.com>
parents:
41401
diff
changeset
|
1772 self.addcontext([]) |
24265
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1773 fromstart, fromend, tostart, toend, proc = limits |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1774 self.fromline = int(fromstart) |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1775 self.toline = int(tostart) |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1776 self.proc = proc |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1777 |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1778 def addcontext(self, context): |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1779 if self.hunk: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1780 h = recordhunk( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1781 self.header, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1782 self.fromline, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1783 self.toline, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1784 self.proc, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1785 self.before, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1786 self.hunk, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1787 context, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1788 maxcontext, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1789 ) |
24265
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1790 self.header.hunks.append(h) |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1791 self.fromline += len(self.before) + h.removed |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1792 self.toline += len(self.before) + h.added |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1793 self.before = [] |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1794 self.hunk = [] |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1795 self.context = context |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1796 |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1797 def addhunk(self, hunk): |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1798 if self.context: |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1799 self.before = self.context |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1800 self.context = [] |
41454
d1d3094b54f9
patch: handle 0 context lines (diff.unified=0) when parsing patches
Kyle Lippincott <spectral@google.com>
parents:
41401
diff
changeset
|
1801 if self.hunk: |
d1d3094b54f9
patch: handle 0 context lines (diff.unified=0) when parsing patches
Kyle Lippincott <spectral@google.com>
parents:
41401
diff
changeset
|
1802 self.addcontext([]) |
24265
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1803 self.hunk = hunk |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1804 |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1805 def newfile(self, hdr): |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1806 self.addcontext([]) |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1807 h = header(hdr) |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1808 self.headers.append(h) |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1809 self.header = h |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1810 |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1811 def addother(self, line): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1812 pass # 'other' lines are ignored |
24265
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1813 |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1814 def finished(self): |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1815 self.addcontext([]) |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1816 return self.headers |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1817 |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1818 transitions = { |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1819 b'file': { |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1820 b'context': addcontext, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1821 b'file': newfile, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1822 b'hunk': addhunk, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1823 b'range': addrange, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1824 }, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1825 b'context': { |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1826 b'file': newfile, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1827 b'hunk': addhunk, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1828 b'range': addrange, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1829 b'other': addother, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1830 }, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1831 b'hunk': { |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1832 b'context': addcontext, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1833 b'file': newfile, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1834 b'range': addrange, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1835 }, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1836 b'range': {b'context': addcontext, b'hunk': addhunk}, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1837 b'other': {b'other': addother}, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1838 } |
24265
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1839 |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1840 p = parser() |
28861
86db5cb55d46
pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents:
28341
diff
changeset
|
1841 fp = stringio() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1842 fp.write(b''.join(originalchunks)) |
24341
616c01b69898
record: change interface of the filtering function
Laurent Charignon <lcharignon@fb.com>
parents:
24306
diff
changeset
|
1843 fp.seek(0) |
24265
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1844 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1845 state = b'context' |
24265
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1846 for newstate, data in scanpatch(fp): |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1847 try: |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1848 p.transitions[state][newstate](p, data) |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1849 except KeyError: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1850 raise PatchError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1851 b'unhandled transition: %s -> %s' % (state, newstate) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1852 ) |
24265
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1853 state = newstate |
24341
616c01b69898
record: change interface of the filtering function
Laurent Charignon <lcharignon@fb.com>
parents:
24306
diff
changeset
|
1854 del fp |
24265
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1855 return p.finished() |
dc655360bccb
record: move parsepatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24264
diff
changeset
|
1856 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1857 |
24244
5918bb365c72
patch.pathtransform: add a prefix parameter
Siddharth Agarwal <sid0@fb.com>
parents:
24243
diff
changeset
|
1858 def pathtransform(path, strip, prefix): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45877
diff
changeset
|
1859 """turn a path from a patch into a path suitable for the repository |
24243
daee2039dd11
patch.pathtransform: add doctests
Siddharth Agarwal <sid0@fb.com>
parents:
24242
diff
changeset
|
1860 |
24244
5918bb365c72
patch.pathtransform: add a prefix parameter
Siddharth Agarwal <sid0@fb.com>
parents:
24243
diff
changeset
|
1861 prefix, if not empty, is expected to be normalized with a / at the end. |
5918bb365c72
patch.pathtransform: add a prefix parameter
Siddharth Agarwal <sid0@fb.com>
parents:
24243
diff
changeset
|
1862 |
24243
daee2039dd11
patch.pathtransform: add doctests
Siddharth Agarwal <sid0@fb.com>
parents:
24242
diff
changeset
|
1863 Returns (stripped components, path in repository). |
daee2039dd11
patch.pathtransform: add doctests
Siddharth Agarwal <sid0@fb.com>
parents:
24242
diff
changeset
|
1864 |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34067
diff
changeset
|
1865 >>> pathtransform(b'a/b/c', 0, b'') |
24243
daee2039dd11
patch.pathtransform: add doctests
Siddharth Agarwal <sid0@fb.com>
parents:
24242
diff
changeset
|
1866 ('', 'a/b/c') |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34067
diff
changeset
|
1867 >>> pathtransform(b' a/b/c ', 0, b'') |
24243
daee2039dd11
patch.pathtransform: add doctests
Siddharth Agarwal <sid0@fb.com>
parents:
24242
diff
changeset
|
1868 ('', ' a/b/c') |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34067
diff
changeset
|
1869 >>> pathtransform(b' a/b/c ', 2, b'') |
24243
daee2039dd11
patch.pathtransform: add doctests
Siddharth Agarwal <sid0@fb.com>
parents:
24242
diff
changeset
|
1870 ('a/b/', 'c') |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34067
diff
changeset
|
1871 >>> pathtransform(b'a/b/c', 0, b'd/e/') |
24385
885a573fa619
patch.pathtransform: prepend prefix even if strip is 0
Siddharth Agarwal <sid0@fb.com>
parents:
24371
diff
changeset
|
1872 ('', 'd/e/a/b/c') |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34067
diff
changeset
|
1873 >>> pathtransform(b' a//b/c ', 2, b'd/e/') |
24244
5918bb365c72
patch.pathtransform: add a prefix parameter
Siddharth Agarwal <sid0@fb.com>
parents:
24243
diff
changeset
|
1874 ('a//b/', 'd/e/c') |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34067
diff
changeset
|
1875 >>> pathtransform(b'a/b/c', 3, b'') |
24243
daee2039dd11
patch.pathtransform: add doctests
Siddharth Agarwal <sid0@fb.com>
parents:
24242
diff
changeset
|
1876 Traceback (most recent call last): |
daee2039dd11
patch.pathtransform: add doctests
Siddharth Agarwal <sid0@fb.com>
parents:
24242
diff
changeset
|
1877 PatchError: unable to strip away 1 of 3 dirs from a/b/c |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45877
diff
changeset
|
1878 """ |
11022
0429d0d49f92
patch: strip paths in leaked git patchmeta objects
Mads Kiilerich <mads@kiilerich.com>
parents:
11021
diff
changeset
|
1879 pathlen = len(path) |
0429d0d49f92
patch: strip paths in leaked git patchmeta objects
Mads Kiilerich <mads@kiilerich.com>
parents:
11021
diff
changeset
|
1880 i = 0 |
0429d0d49f92
patch: strip paths in leaked git patchmeta objects
Mads Kiilerich <mads@kiilerich.com>
parents:
11021
diff
changeset
|
1881 if strip == 0: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1882 return b'', prefix + path.rstrip() |
11022
0429d0d49f92
patch: strip paths in leaked git patchmeta objects
Mads Kiilerich <mads@kiilerich.com>
parents:
11021
diff
changeset
|
1883 count = strip |
0429d0d49f92
patch: strip paths in leaked git patchmeta objects
Mads Kiilerich <mads@kiilerich.com>
parents:
11021
diff
changeset
|
1884 while count > 0: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1885 i = path.find(b'/', i) |
11022
0429d0d49f92
patch: strip paths in leaked git patchmeta objects
Mads Kiilerich <mads@kiilerich.com>
parents:
11021
diff
changeset
|
1886 if i == -1: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1887 raise PatchError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1888 _(b"unable to strip away %d of %d dirs from %s") |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1889 % (count, strip, path) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1890 ) |
11022
0429d0d49f92
patch: strip paths in leaked git patchmeta objects
Mads Kiilerich <mads@kiilerich.com>
parents:
11021
diff
changeset
|
1891 i += 1 |
0429d0d49f92
patch: strip paths in leaked git patchmeta objects
Mads Kiilerich <mads@kiilerich.com>
parents:
11021
diff
changeset
|
1892 # consume '//' in the path |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1893 while i < pathlen - 1 and path[i : i + 1] == b'/': |
11022
0429d0d49f92
patch: strip paths in leaked git patchmeta objects
Mads Kiilerich <mads@kiilerich.com>
parents:
11021
diff
changeset
|
1894 i += 1 |
0429d0d49f92
patch: strip paths in leaked git patchmeta objects
Mads Kiilerich <mads@kiilerich.com>
parents:
11021
diff
changeset
|
1895 count -= 1 |
24244
5918bb365c72
patch.pathtransform: add a prefix parameter
Siddharth Agarwal <sid0@fb.com>
parents:
24243
diff
changeset
|
1896 return path[:i].lstrip(), prefix + path[i:].rstrip() |
11022
0429d0d49f92
patch: strip paths in leaked git patchmeta objects
Mads Kiilerich <mads@kiilerich.com>
parents:
11021
diff
changeset
|
1897 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1898 |
24245
740a17f885a1
patch.makepatchmeta: accept a prefix parameter
Siddharth Agarwal <sid0@fb.com>
parents:
24244
diff
changeset
|
1899 def makepatchmeta(backend, afile_orig, bfile_orig, hunk, strip, prefix): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1900 nulla = afile_orig == b"/dev/null" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1901 nullb = bfile_orig == b"/dev/null" |
14451
c78d41db6f88
patch: refactor file creation/removal detection
Patrick Mezard <pmezard@gmail.com>
parents:
14437
diff
changeset
|
1902 create = nulla and hunk.starta == 0 and hunk.lena == 0 |
c78d41db6f88
patch: refactor file creation/removal detection
Patrick Mezard <pmezard@gmail.com>
parents:
14437
diff
changeset
|
1903 remove = nullb and hunk.startb == 0 and hunk.lenb == 0 |
24245
740a17f885a1
patch.makepatchmeta: accept a prefix parameter
Siddharth Agarwal <sid0@fb.com>
parents:
24244
diff
changeset
|
1904 abase, afile = pathtransform(afile_orig, strip, prefix) |
14351
d54f9bbcc640
patch: add lexists() to backends, use it in selectfile()
Patrick Mezard <pmezard@gmail.com>
parents:
14350
diff
changeset
|
1905 gooda = not nulla and backend.exists(afile) |
24245
740a17f885a1
patch.makepatchmeta: accept a prefix parameter
Siddharth Agarwal <sid0@fb.com>
parents:
24244
diff
changeset
|
1906 bbase, bfile = pathtransform(bfile_orig, strip, prefix) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1907 if afile == bfile: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1908 goodb = gooda |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1909 else: |
14351
d54f9bbcc640
patch: add lexists() to backends, use it in selectfile()
Patrick Mezard <pmezard@gmail.com>
parents:
14350
diff
changeset
|
1910 goodb = not nullb and backend.exists(bfile) |
14451
c78d41db6f88
patch: refactor file creation/removal detection
Patrick Mezard <pmezard@gmail.com>
parents:
14437
diff
changeset
|
1911 missing = not goodb and not gooda and not create |
9328
648d6a1a1cf2
patch: create file even if source is not /dev/null
Brendan Cully <brendan@kublai.com>
parents:
9248
diff
changeset
|
1912 |
11820
75de514a50f3
patch: fix typo in comment
Martin Geisler <mg@aragost.com>
parents:
11645
diff
changeset
|
1913 # some diff programs apparently produce patches where the afile is |
75de514a50f3
patch: fix typo in comment
Martin Geisler <mg@aragost.com>
parents:
11645
diff
changeset
|
1914 # not /dev/null, but afile starts with bfile |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1915 abasedir = afile[: afile.rfind(b'/') + 1] |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1916 bbasedir = bfile[: bfile.rfind(b'/') + 1] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1917 if ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1918 missing |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1919 and abasedir == bbasedir |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1920 and afile.startswith(bfile) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1921 and hunk.starta == 0 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1922 and hunk.lena == 0 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1923 ): |
14451
c78d41db6f88
patch: refactor file creation/removal detection
Patrick Mezard <pmezard@gmail.com>
parents:
14437
diff
changeset
|
1924 create = True |
c78d41db6f88
patch: refactor file creation/removal detection
Patrick Mezard <pmezard@gmail.com>
parents:
14437
diff
changeset
|
1925 missing = False |
9328
648d6a1a1cf2
patch: create file even if source is not /dev/null
Brendan Cully <brendan@kublai.com>
parents:
9248
diff
changeset
|
1926 |
6295
bace1990ab12
patch: fix corner case with update + copy patch handling (issue 937)
Patrick Mezard <pmezard@gmail.com>
parents:
6280
diff
changeset
|
1927 # If afile is "a/b/foo" and bfile is "a/b/foo.orig" we assume the |
bace1990ab12
patch: fix corner case with update + copy patch handling (issue 937)
Patrick Mezard <pmezard@gmail.com>
parents:
6280
diff
changeset
|
1928 # diff is between a file and its backup. In this case, the original |
bace1990ab12
patch: fix corner case with update + copy patch handling (issue 937)
Patrick Mezard <pmezard@gmail.com>
parents:
6280
diff
changeset
|
1929 # file should be patched (see original mpatch code). |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1930 isbackup = abase == bbase and bfile.startswith(afile) |
5652
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
1931 fname = None |
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
1932 if not missing: |
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
1933 if gooda and goodb: |
24306
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
24269
diff
changeset
|
1934 if isbackup: |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
24269
diff
changeset
|
1935 fname = afile |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
24269
diff
changeset
|
1936 else: |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
24269
diff
changeset
|
1937 fname = bfile |
5652
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
1938 elif gooda: |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1939 fname = afile |
5760
0145f9afb0e7
Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5706
diff
changeset
|
1940 |
5652
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
1941 if not fname: |
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
1942 if not nullb: |
24306
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
24269
diff
changeset
|
1943 if isbackup: |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
24269
diff
changeset
|
1944 fname = afile |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
24269
diff
changeset
|
1945 else: |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
24269
diff
changeset
|
1946 fname = bfile |
5652
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
1947 elif not nulla: |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1948 fname = afile |
5652
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
1949 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1950 raise PatchError(_(b"undefined source and destination files")) |
5760
0145f9afb0e7
Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5706
diff
changeset
|
1951 |
14566
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
1952 gp = patchmeta(fname) |
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
1953 if create: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1954 gp.op = b'ADD' |
14566
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
1955 elif remove: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1956 gp.op = b'DELETE' |
14566
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
1957 return gp |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1958 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1959 |
24264
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1960 def scanpatch(fp): |
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1961 """like patch.iterhunks, but yield different events |
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1962 |
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1963 - ('file', [header_lines + fromfile + tofile]) |
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1964 - ('context', [context_lines]) |
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1965 - ('hunk', [hunk_lines]) |
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1966 - ('range', (-start,len, +start,len, proc)) |
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1967 """ |
34066
871a58b5f428
py3: fix type of regex literals in patch.py
Yuya Nishihara <yuya@tcha.org>
parents:
34042
diff
changeset
|
1968 lines_re = re.compile(br'@@ -(\d+),(\d+) \+(\d+),(\d+) @@\s*(.*)') |
24264
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1969 lr = linereader(fp) |
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1970 |
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1971 def scanwhile(first, p): |
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1972 """scan lr while predicate holds""" |
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1973 lines = [first] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1974 for line in iter(lr.readline, b''): |
24264
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1975 if p(line): |
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1976 lines.append(line) |
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1977 else: |
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1978 lr.push(line) |
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1979 break |
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1980 return lines |
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1981 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1982 for line in iter(lr.readline, b''): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1983 if line.startswith(b'diff --git a/') or line.startswith(b'diff -r '): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1984 |
24264
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1985 def notheader(line): |
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1986 s = line.split(None, 1) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1987 return not s or s[0] not in (b'---', b'diff') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
1988 |
24264
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1989 header = scanwhile(line, notheader) |
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1990 fromfile = lr.readline() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1991 if fromfile.startswith(b'---'): |
24264
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1992 tofile = lr.readline() |
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1993 header += [fromfile, tofile] |
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1994 else: |
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
1995 lr.push(fromfile) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1996 yield b'file', header |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1997 elif line.startswith(b' '): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1998 cs = (b' ', b'\\') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1999 yield b'context', scanwhile(line, lambda l: l.startswith(cs)) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2000 elif line.startswith((b'-', b'+')): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2001 cs = (b'-', b'+', b'\\') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2002 yield b'hunk', scanwhile(line, lambda l: l.startswith(cs)) |
24264
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
2003 else: |
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
2004 m = lines_re.match(line) |
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
2005 if m: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2006 yield b'range', m.groups() |
24264
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
2007 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2008 yield b'other', line |
24264
c4205452f1b7
record: move scanpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents:
24263
diff
changeset
|
2009 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2010 |
7152
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
2011 def scangitpatch(lr, firstline): |
7186
f77c8d8331ca
clean up trailing spaces, leading spaces in C
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7153
diff
changeset
|
2012 """ |
7152
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
2013 Git patches can emit: |
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
2014 - rename a to b |
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
2015 - change b |
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
2016 - copy a to c |
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
2017 - change c |
7186
f77c8d8331ca
clean up trailing spaces, leading spaces in C
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7153
diff
changeset
|
2018 |
7152
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
2019 We cannot apply this sequence as-is, the renamed 'a' could not be |
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
2020 found for it would have been renamed already. And we cannot copy |
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
2021 from 'b' instead because 'b' would have been changed already. So |
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
2022 we scan the git patch for copy and rename commands so we can |
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
2023 perform the copies ahead of time. |
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
2024 """ |
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
2025 pos = 0 |
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
2026 try: |
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
2027 pos = lr.fp.tell() |
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
2028 fp = lr.fp |
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
2029 except IOError: |
28861
86db5cb55d46
pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents:
28341
diff
changeset
|
2030 fp = stringio(lr.fp.read()) |
14418
0174d1f79280
patch: remove EOL support from linereader class
Patrick Mezard <pmezard@gmail.com>
parents:
14402
diff
changeset
|
2031 gitlr = linereader(fp) |
7152
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
2032 gitlr.push(firstline) |
12669
b0fa39c68370
patch: remove unused flags from readgitpatch()
Patrick Mezard <pmezard@gmail.com>
parents:
12645
diff
changeset
|
2033 gitpatches = readgitpatch(gitlr) |
7152
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
2034 fp.seek(pos) |
12669
b0fa39c68370
patch: remove unused flags from readgitpatch()
Patrick Mezard <pmezard@gmail.com>
parents:
12645
diff
changeset
|
2035 return gitpatches |
7152
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
2036 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2037 |
14240
28762bb767dc
patch: remove unused ui arg to iterhunks
Idan Kamara <idankk86@gmail.com>
parents:
14234
diff
changeset
|
2038 def iterhunks(fp): |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
2039 """Read a patch and yield the following events: |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
2040 - ("file", afile, bfile, firsthunk): select a new target file. |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
2041 - ("hunk", hunk): a new hunk is ready to be applied, follows a |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
2042 "file" event. |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
2043 - ("git", gitchanges): current diff is in git format, gitchanges |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
2044 maps filenames to gitpatch records. Unique event. |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
2045 """ |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2046 afile = b"" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2047 bfile = b"" |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2048 state = None |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2049 hunknum = 0 |
14017
19a7b48446e3
patch: remove redundant variable in iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
13971
diff
changeset
|
2050 emitfile = newfile = False |
14388
37c997d21752
patch: stop handling hunkless git blocks out of stream
Patrick Mezard <pmezard@gmail.com>
parents:
14387
diff
changeset
|
2051 gitpatches = None |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
2052 |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2053 # our states |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2054 BFILE = 1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2055 context = None |
10128
ea7c392f2b08
patch: drop eol normalization fast-path for 'lf' and 'crlf'
Patrick Mezard <pmezard@gmail.com>
parents:
10127
diff
changeset
|
2056 lr = linereader(fp) |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
2057 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2058 for x in iter(lr.readline, b''): |
14383
1bd52cb12a55
patch: refactor iterhunks() regular and binary files emission
Patrick Mezard <pmezard@gmail.com>
parents:
14382
diff
changeset
|
2059 if state == BFILE and ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2060 (not context and x.startswith(b'@')) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2061 or (context is not False and x.startswith(b'***************')) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2062 or x.startswith(b'GIT binary patch') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2063 ): |
14388
37c997d21752
patch: stop handling hunkless git blocks out of stream
Patrick Mezard <pmezard@gmail.com>
parents:
14387
diff
changeset
|
2064 gp = None |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2065 if gitpatches and gitpatches[-1].ispatching(afile, bfile): |
16506
fc4e0fecf403
patch: fix patch hunk/metdata synchronization (issue3384)
Patrick Mezard <patrick@mezard.eu>
parents:
16475
diff
changeset
|
2066 gp = gitpatches.pop() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2067 if x.startswith(b'GIT binary patch'): |
16523
727068417b95
patch: include file name in binary patch error messages
Patrick Mezard <patrick@mezard.eu>
parents:
16522
diff
changeset
|
2068 h = binhunk(lr, gp.path) |
14383
1bd52cb12a55
patch: refactor iterhunks() regular and binary files emission
Patrick Mezard <pmezard@gmail.com>
parents:
14382
diff
changeset
|
2069 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2070 if context is None and x.startswith(b'***************'): |
14383
1bd52cb12a55
patch: refactor iterhunks() regular and binary files emission
Patrick Mezard <pmezard@gmail.com>
parents:
14382
diff
changeset
|
2071 context = True |
14451
c78d41db6f88
patch: refactor file creation/removal detection
Patrick Mezard <pmezard@gmail.com>
parents:
14437
diff
changeset
|
2072 h = hunk(x, hunknum + 1, lr, context) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2073 hunknum += 1 |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
2074 if emitfile: |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
2075 emitfile = False |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2076 yield b'file', (afile, bfile, h, gp and gp.copy() or None) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2077 yield b'hunk', h |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2078 elif x.startswith(b'diff --git a/'): |
46246
416ecdaa12df
patch: handle filenames with trailing spaces
Kyle Lippincott <spectral@google.com>
parents:
46030
diff
changeset
|
2079 m = gitre.match(x.rstrip(b'\r\n')) |
14387 | 2080 if not m: |
2081 continue | |
16506
fc4e0fecf403
patch: fix patch hunk/metdata synchronization (issue3384)
Patrick Mezard <patrick@mezard.eu>
parents:
16475
diff
changeset
|
2082 if gitpatches is None: |
14387 | 2083 # scan whole input for git metadata |
16506
fc4e0fecf403
patch: fix patch hunk/metdata synchronization (issue3384)
Patrick Mezard <patrick@mezard.eu>
parents:
16475
diff
changeset
|
2084 gitpatches = scangitpatch(lr, x) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2085 yield b'git', [ |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2086 g.copy() for g in gitpatches if g.op in (b'COPY', b'RENAME') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2087 ] |
14388
37c997d21752
patch: stop handling hunkless git blocks out of stream
Patrick Mezard <pmezard@gmail.com>
parents:
14387
diff
changeset
|
2088 gitpatches.reverse() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2089 afile = b'a/' + m.group(1) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2090 bfile = b'b/' + m.group(2) |
16506
fc4e0fecf403
patch: fix patch hunk/metdata synchronization (issue3384)
Patrick Mezard <patrick@mezard.eu>
parents:
16475
diff
changeset
|
2091 while gitpatches and not gitpatches[-1].ispatching(afile, bfile): |
fc4e0fecf403
patch: fix patch hunk/metdata synchronization (issue3384)
Patrick Mezard <patrick@mezard.eu>
parents:
16475
diff
changeset
|
2092 gp = gitpatches.pop() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2093 yield b'file', ( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2094 b'a/' + gp.path, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2095 b'b/' + gp.path, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2096 None, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2097 gp.copy(), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2098 ) |
16506
fc4e0fecf403
patch: fix patch hunk/metdata synchronization (issue3384)
Patrick Mezard <patrick@mezard.eu>
parents:
16475
diff
changeset
|
2099 if not gitpatches: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2100 raise PatchError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2101 _(b'failed to synchronize metadata for "%s"') % afile[2:] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2102 ) |
14387 | 2103 newfile = True |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2104 elif x.startswith(b'---'): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2105 # check for a unified diff |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2106 l2 = lr.readline() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2107 if not l2.startswith(b'+++'): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2108 lr.push(l2) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2109 continue |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2110 newfile = True |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2111 context = False |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2112 afile = parsefilename(x) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2113 bfile = parsefilename(l2) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2114 elif x.startswith(b'***'): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2115 # check for a context diff |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2116 l2 = lr.readline() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2117 if not l2.startswith(b'---'): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2118 lr.push(l2) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2119 continue |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2120 l3 = lr.readline() |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2121 lr.push(l3) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2122 if not l3.startswith(b"***************"): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2123 lr.push(l2) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2124 continue |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2125 newfile = True |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2126 context = True |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2127 afile = parsefilename(x) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2128 bfile = parsefilename(l2) |
3057
d16b93f4a6ca
unlink temporary patch files even when an exception is raised
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3056
diff
changeset
|
2129 |
14017
19a7b48446e3
patch: remove redundant variable in iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
13971
diff
changeset
|
2130 if newfile: |
19a7b48446e3
patch: remove redundant variable in iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
13971
diff
changeset
|
2131 newfile = False |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
2132 emitfile = True |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2133 state = BFILE |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2134 hunknum = 0 |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
2135 |
14388
37c997d21752
patch: stop handling hunkless git blocks out of stream
Patrick Mezard <pmezard@gmail.com>
parents:
14387
diff
changeset
|
2136 while gitpatches: |
16506
fc4e0fecf403
patch: fix patch hunk/metdata synchronization (issue3384)
Patrick Mezard <patrick@mezard.eu>
parents:
16475
diff
changeset
|
2137 gp = gitpatches.pop() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2138 yield b'file', (b'a/' + gp.path, b'b/' + gp.path, None, gp.copy()) |
14388
37c997d21752
patch: stop handling hunkless git blocks out of stream
Patrick Mezard <pmezard@gmail.com>
parents:
14387
diff
changeset
|
2139 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2140 |
20137
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2141 def applybindelta(binchunk, data): |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2142 """Apply a binary delta hunk |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2143 The algorithm used is the algorithm from git's patch-delta.c |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2144 """ |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2145 |
20137
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2146 def deltahead(binchunk): |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2147 i = 0 |
38085
e887381e2976
py3: bytestr() bytes to get bytechar while iterating on it
Pulkit Goyal <7895pulkit@gmail.com>
parents:
38084
diff
changeset
|
2148 for c in pycompat.bytestr(binchunk): |
20137
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2149 i += 1 |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2150 if not (ord(c) & 0x80): |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2151 return i |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2152 return i |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2153 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2154 out = b"" |
20137
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2155 s = deltahead(binchunk) |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2156 binchunk = binchunk[s:] |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2157 s = deltahead(binchunk) |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2158 binchunk = binchunk[s:] |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2159 i = 0 |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2160 while i < len(binchunk): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2161 cmd = ord(binchunk[i : i + 1]) |
20137
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2162 i += 1 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2163 if cmd & 0x80: |
20137
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2164 offset = 0 |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2165 size = 0 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2166 if cmd & 0x01: |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2167 offset = ord(binchunk[i : i + 1]) |
20137
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2168 i += 1 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2169 if cmd & 0x02: |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2170 offset |= ord(binchunk[i : i + 1]) << 8 |
20137
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2171 i += 1 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2172 if cmd & 0x04: |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2173 offset |= ord(binchunk[i : i + 1]) << 16 |
20137
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2174 i += 1 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2175 if cmd & 0x08: |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2176 offset |= ord(binchunk[i : i + 1]) << 24 |
20137
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2177 i += 1 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2178 if cmd & 0x10: |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2179 size = ord(binchunk[i : i + 1]) |
20137
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2180 i += 1 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2181 if cmd & 0x20: |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2182 size |= ord(binchunk[i : i + 1]) << 8 |
20137
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2183 i += 1 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2184 if cmd & 0x40: |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2185 size |= ord(binchunk[i : i + 1]) << 16 |
20137
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2186 i += 1 |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2187 if size == 0: |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2188 size = 0x10000 |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2189 offset_end = offset + size |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2190 out += data[offset:offset_end] |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2191 elif cmd != 0: |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2192 offset_end = i + cmd |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2193 out += binchunk[i:offset_end] |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2194 i += cmd |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2195 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2196 raise PatchError(_(b'unexpected delta opcode 0')) |
20137
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2197 return out |
9f1d4323c749
patch: add support for git delta hunks
Nicolas Vigier <boklm@mars-attacks.org>
parents:
20035
diff
changeset
|
2198 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2199 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2200 def applydiff(ui, fp, backend, store, strip=1, prefix=b'', eolmode=b'strict'): |
10966
91c58cf54eee
patch: refactor applydiff to allow for mempatching
Augie Fackler <durin42@gmail.com>
parents:
10965
diff
changeset
|
2201 """Reads a patch from fp and tries to apply it. |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
2202 |
14565
3cacc232f27f
patch: stop updating changed files set in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14564
diff
changeset
|
2203 Returns 0 for a clean patch, -1 if any rejects were found and 1 if |
3cacc232f27f
patch: stop updating changed files set in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14564
diff
changeset
|
2204 there was any fuzz. |
8810
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
2205 |
10101
155fe35534d3
patch: propagate eolmode down to patchfile
Martin Geisler <mg@lazybytes.net>
parents:
9725
diff
changeset
|
2206 If 'eolmode' is 'strict', the patch content and patched file are |
155fe35534d3
patch: propagate eolmode down to patchfile
Martin Geisler <mg@lazybytes.net>
parents:
9725
diff
changeset
|
2207 read in binary mode. Otherwise, line endings are ignored when |
155fe35534d3
patch: propagate eolmode down to patchfile
Martin Geisler <mg@lazybytes.net>
parents:
9725
diff
changeset
|
2208 patching then normalized according to 'eolmode'. |
8810
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
2209 """ |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2210 return _applydiff( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2211 ui, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2212 fp, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2213 patchfile, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2214 backend, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2215 store, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2216 strip=strip, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2217 prefix=prefix, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2218 eolmode=eolmode, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2219 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2220 |
10966
91c58cf54eee
patch: refactor applydiff to allow for mempatching
Augie Fackler <durin42@gmail.com>
parents:
10965
diff
changeset
|
2221 |
35062
1706eae096e2
patch: accept prefix argument to changedfiles() helper
Martin von Zweigbergk <martinvonz@google.com>
parents:
34968
diff
changeset
|
2222 def _canonprefix(repo, prefix): |
1706eae096e2
patch: accept prefix argument to changedfiles() helper
Martin von Zweigbergk <martinvonz@google.com>
parents:
34968
diff
changeset
|
2223 if prefix: |
1706eae096e2
patch: accept prefix argument to changedfiles() helper
Martin von Zweigbergk <martinvonz@google.com>
parents:
34968
diff
changeset
|
2224 prefix = pathutil.canonpath(repo.root, repo.getcwd(), prefix) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2225 if prefix != b'': |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2226 prefix += b'/' |
35062
1706eae096e2
patch: accept prefix argument to changedfiles() helper
Martin von Zweigbergk <martinvonz@google.com>
parents:
34968
diff
changeset
|
2227 return prefix |
1706eae096e2
patch: accept prefix argument to changedfiles() helper
Martin von Zweigbergk <martinvonz@google.com>
parents:
34968
diff
changeset
|
2228 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2229 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2230 def _applydiff( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2231 ui, fp, patcher, backend, store, strip=1, prefix=b'', eolmode=b'strict' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2232 ): |
35062
1706eae096e2
patch: accept prefix argument to changedfiles() helper
Martin von Zweigbergk <martinvonz@google.com>
parents:
34968
diff
changeset
|
2233 prefix = _canonprefix(backend.repo, prefix) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2234 |
14389
909ac6b9636b
patch: stop modifying gitpatch objects
Patrick Mezard <pmezard@gmail.com>
parents:
14388
diff
changeset
|
2235 def pstrip(p): |
24246
394a91cb3d4a
patch._applydiff: accept a prefix parameter
Siddharth Agarwal <sid0@fb.com>
parents:
24245
diff
changeset
|
2236 return pathtransform(p, strip - 1, prefix)[1] |
14389
909ac6b9636b
patch: stop modifying gitpatch objects
Patrick Mezard <pmezard@gmail.com>
parents:
14388
diff
changeset
|
2237 |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
2238 rejects = 0 |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
2239 err = 0 |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
2240 current_file = None |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
2241 |
14240
28762bb767dc
patch: remove unused ui arg to iterhunks
Idan Kamara <idankk86@gmail.com>
parents:
14234
diff
changeset
|
2242 for state, values in iterhunks(fp): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2243 if state == b'hunk': |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
2244 if not current_file: |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
2245 continue |
11021
c47a1cfad572
patch: minor cleanup of _applydiff
Mads Kiilerich <mads@kiilerich.com>
parents:
11020
diff
changeset
|
2246 ret = current_file.apply(values) |
14565
3cacc232f27f
patch: stop updating changed files set in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14564
diff
changeset
|
2247 if ret > 0: |
3cacc232f27f
patch: stop updating changed files set in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14564
diff
changeset
|
2248 err = 1 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2249 elif state == b'file': |
13701
bc38ff7cb919
patch: move closefile() into patchfile.close()
Patrick Mezard <pmezard@gmail.com>
parents:
13700
diff
changeset
|
2250 if current_file: |
bc38ff7cb919
patch: move closefile() into patchfile.close()
Patrick Mezard <pmezard@gmail.com>
parents:
13700
diff
changeset
|
2251 rejects += current_file.close() |
14388
37c997d21752
patch: stop handling hunkless git blocks out of stream
Patrick Mezard <pmezard@gmail.com>
parents:
14387
diff
changeset
|
2252 current_file = None |
37c997d21752
patch: stop handling hunkless git blocks out of stream
Patrick Mezard <pmezard@gmail.com>
parents:
14387
diff
changeset
|
2253 afile, bfile, first_hunk, gp = values |
37c997d21752
patch: stop handling hunkless git blocks out of stream
Patrick Mezard <pmezard@gmail.com>
parents:
14387
diff
changeset
|
2254 if gp: |
14566
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
2255 gp.path = pstrip(gp.path) |
14452
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
2256 if gp.oldpath: |
14566
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
2257 gp.oldpath = pstrip(gp.oldpath) |
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
2258 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2259 gp = makepatchmeta( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2260 backend, afile, bfile, first_hunk, strip, prefix |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2261 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2262 if gp.op == b'RENAME': |
14566
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
2263 backend.unlink(gp.oldpath) |
14388
37c997d21752
patch: stop handling hunkless git blocks out of stream
Patrick Mezard <pmezard@gmail.com>
parents:
14387
diff
changeset
|
2264 if not first_hunk: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2265 if gp.op == b'DELETE': |
14566
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
2266 backend.unlink(gp.path) |
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
2267 continue |
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
2268 data, mode = None, None |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2269 if gp.op in (b'RENAME', b'COPY'): |
14609
f53dc0787424
patch: extend filtestore to store an optional copy source
Patrick Mezard <pmezard@gmail.com>
parents:
14566
diff
changeset
|
2270 data, mode = store.getfile(gp.oldpath)[:2] |
30078
173bdb502503
import: abort instead of crashing when copy source does not exist (issue5375)
Ryan McElroy <rmcelroy@fb.com>
parents:
29948
diff
changeset
|
2271 if data is None: |
173bdb502503
import: abort instead of crashing when copy source does not exist (issue5375)
Ryan McElroy <rmcelroy@fb.com>
parents:
29948
diff
changeset
|
2272 # This means that the old path does not exist |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2273 raise PatchError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2274 _(b"source file '%s' does not exist") % gp.oldpath |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2275 ) |
14566
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
2276 if gp.mode: |
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
2277 mode = gp.mode |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2278 if gp.op == b'ADD': |
14566
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
2279 # Added files without content have no hunk and |
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
2280 # must be created |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2281 data = b'' |
14566
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
2282 if data or mode: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2283 if gp.op in (b'ADD', b'RENAME', b'COPY') and backend.exists( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2284 gp.path |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2285 ): |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2286 raise PatchError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2287 _( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2288 b"cannot create %s: destination " |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2289 b"already exists" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2290 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2291 % gp.path |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2292 ) |
14566
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
2293 backend.setfile(gp.path, data, mode, gp.oldpath) |
14388
37c997d21752
patch: stop handling hunkless git blocks out of stream
Patrick Mezard <pmezard@gmail.com>
parents:
14387
diff
changeset
|
2294 continue |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
2295 try: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2296 current_file = patcher(ui, gp, backend, store, eolmode=eolmode) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25658
diff
changeset
|
2297 except PatchError as inst: |
43723
eab0b7383cd3
patch: fix a str + bytes issue in an exception handler
Matt Harbison <matt_harbison@yahoo.com>
parents:
43166
diff
changeset
|
2298 ui.warn(stringutil.forcebytestr(inst) + b'\n') |
11021
c47a1cfad572
patch: minor cleanup of _applydiff
Mads Kiilerich <mads@kiilerich.com>
parents:
11020
diff
changeset
|
2299 current_file = None |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
2300 rejects += 1 |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
2301 continue |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2302 elif state == b'git': |
11021
c47a1cfad572
patch: minor cleanup of _applydiff
Mads Kiilerich <mads@kiilerich.com>
parents:
11020
diff
changeset
|
2303 for gp in values: |
14452
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
2304 path = pstrip(gp.oldpath) |
22296
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
21833
diff
changeset
|
2305 data, mode = backend.getfile(path) |
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
21833
diff
changeset
|
2306 if data is None: |
16813
6d42c797ca6e
patch: keep patching after missing copy source (issue3480)
Patrick Mezard <patrick@mezard.eu>
parents:
16650
diff
changeset
|
2307 # The error ignored here will trigger a getfile() |
6d42c797ca6e
patch: keep patching after missing copy source (issue3480)
Patrick Mezard <patrick@mezard.eu>
parents:
16650
diff
changeset
|
2308 # error in a place more appropriate for error |
6d42c797ca6e
patch: keep patching after missing copy source (issue3480)
Patrick Mezard <patrick@mezard.eu>
parents:
16650
diff
changeset
|
2309 # handling, and will not interrupt the patching |
6d42c797ca6e
patch: keep patching after missing copy source (issue3480)
Patrick Mezard <patrick@mezard.eu>
parents:
16650
diff
changeset
|
2310 # process. |
22296
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
21833
diff
changeset
|
2311 pass |
16813
6d42c797ca6e
patch: keep patching after missing copy source (issue3480)
Patrick Mezard <patrick@mezard.eu>
parents:
16650
diff
changeset
|
2312 else: |
6d42c797ca6e
patch: keep patching after missing copy source (issue3480)
Patrick Mezard <patrick@mezard.eu>
parents:
16650
diff
changeset
|
2313 store.setfile(path, data, mode) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2314 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2315 raise error.Abort(_(b'unsupported parser state: %s') % state) |
5649
a583117b536a
patch: move NoHunk detection up with parsing code
Patrick Mezard <pmezard@gmail.com>
parents:
5581
diff
changeset
|
2316 |
13701
bc38ff7cb919
patch: move closefile() into patchfile.close()
Patrick Mezard <pmezard@gmail.com>
parents:
13700
diff
changeset
|
2317 if current_file: |
bc38ff7cb919
patch: move closefile() into patchfile.close()
Patrick Mezard <pmezard@gmail.com>
parents:
13700
diff
changeset
|
2318 rejects += current_file.close() |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
2319 |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2320 if rejects: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2321 return -1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
2322 return err |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
2323 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2324 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2325 def _externalpatch(ui, repo, patcher, patchname, strip, files, similarity): |
7151
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
2326 """use <patcher> to apply <patchname> to the working directory. |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
2327 returns whether patch was applied with fuzz factor.""" |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
2328 |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
2329 fuzz = False |
12673
9ad16d1bce4b
patch: simplify externalpatch() arguments
Patrick Mezard <pmezard@gmail.com>
parents:
12671
diff
changeset
|
2330 args = [] |
14382
2d16f15da7bd
patch: remove patch.patch() cwd argument
Patrick Mezard <pmezard@gmail.com>
parents:
14381
diff
changeset
|
2331 cwd = repo.root |
7151
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
2332 if cwd: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2333 args.append(b'-d %s' % procutil.shellquote(cwd)) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2334 cmd = b'%s %s -p%d < %s' % ( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2335 patcher, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2336 b' '.join(args), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2337 strip, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2338 procutil.shellquote(patchname), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2339 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2340 ui.debug(b'Using external patch tool: %s\n' % cmd) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2341 fp = procutil.popen(cmd, b'rb') |
14381
d4192500586a
patch: merge _updatedir() into externalpatch()
Patrick Mezard <pmezard@gmail.com>
parents:
14370
diff
changeset
|
2342 try: |
30397 | 2343 for line in util.iterfile(fp): |
14381
d4192500586a
patch: merge _updatedir() into externalpatch()
Patrick Mezard <pmezard@gmail.com>
parents:
14370
diff
changeset
|
2344 line = line.rstrip() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2345 ui.note(line + b'\n') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2346 if line.startswith(b'patching file '): |
14381
d4192500586a
patch: merge _updatedir() into externalpatch()
Patrick Mezard <pmezard@gmail.com>
parents:
14370
diff
changeset
|
2347 pf = util.parsepatchoutput(line) |
d4192500586a
patch: merge _updatedir() into externalpatch()
Patrick Mezard <pmezard@gmail.com>
parents:
14370
diff
changeset
|
2348 printed_file = False |
14564
65f4512e40e4
patch: turn patch() touched files dict into a set
Patrick Mezard <pmezard@gmail.com>
parents:
14535
diff
changeset
|
2349 files.add(pf) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2350 elif line.find(b'with fuzz') >= 0: |
14381
d4192500586a
patch: merge _updatedir() into externalpatch()
Patrick Mezard <pmezard@gmail.com>
parents:
14370
diff
changeset
|
2351 fuzz = True |
d4192500586a
patch: merge _updatedir() into externalpatch()
Patrick Mezard <pmezard@gmail.com>
parents:
14370
diff
changeset
|
2352 if not printed_file: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2353 ui.warn(pf + b'\n') |
14381
d4192500586a
patch: merge _updatedir() into externalpatch()
Patrick Mezard <pmezard@gmail.com>
parents:
14370
diff
changeset
|
2354 printed_file = True |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2355 ui.warn(line + b'\n') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2356 elif line.find(b'saving rejects to file') >= 0: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2357 ui.warn(line + b'\n') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2358 elif line.find(b'FAILED') >= 0: |
14381
d4192500586a
patch: merge _updatedir() into externalpatch()
Patrick Mezard <pmezard@gmail.com>
parents:
14370
diff
changeset
|
2359 if not printed_file: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2360 ui.warn(pf + b'\n') |
14381
d4192500586a
patch: merge _updatedir() into externalpatch()
Patrick Mezard <pmezard@gmail.com>
parents:
14370
diff
changeset
|
2361 printed_file = True |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2362 ui.warn(line + b'\n') |
14381
d4192500586a
patch: merge _updatedir() into externalpatch()
Patrick Mezard <pmezard@gmail.com>
parents:
14370
diff
changeset
|
2363 finally: |
d4192500586a
patch: merge _updatedir() into externalpatch()
Patrick Mezard <pmezard@gmail.com>
parents:
14370
diff
changeset
|
2364 if files: |
19155
0b3689a08df5
patch: use scmutil.marktouched instead of scmutil.addremove
Siddharth Agarwal <sid0@fb.com>
parents:
18830
diff
changeset
|
2365 scmutil.marktouched(repo, files, similarity) |
7151
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
2366 code = fp.close() |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
2367 if code: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2368 raise PatchError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2369 _(b"patch command failed: %s") % procutil.explainexit(code) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2370 ) |
7151
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
2371 return fuzz |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
2372 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2373 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2374 def patchbackend( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2375 ui, backend, patchobj, strip, prefix, files=None, eolmode=b'strict' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2376 ): |
9683
5c8651e2f5e0
patch: don't use mutable object as default argument
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9682
diff
changeset
|
2377 if files is None: |
14564
65f4512e40e4
patch: turn patch() touched files dict into a set
Patrick Mezard <pmezard@gmail.com>
parents:
14535
diff
changeset
|
2378 files = set() |
8810
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
2379 if eolmode is None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2380 eolmode = ui.config(b'patch', b'eol') |
10101
155fe35534d3
patch: propagate eolmode down to patchfile
Martin Geisler <mg@lazybytes.net>
parents:
9725
diff
changeset
|
2381 if eolmode.lower() not in eolmodes: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2382 raise error.Abort(_(b'unsupported line endings type: %s') % eolmode) |
10101
155fe35534d3
patch: propagate eolmode down to patchfile
Martin Geisler <mg@lazybytes.net>
parents:
9725
diff
changeset
|
2383 eolmode = eolmode.lower() |
8843
eb7b247a98ea
kill trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8817
diff
changeset
|
2384 |
14452
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
2385 store = filestore() |
7151
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
2386 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2387 fp = open(patchobj, b'rb') |
7151
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
2388 except TypeError: |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
2389 fp = patchobj |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
2390 try: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2391 ret = applydiff( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2392 ui, fp, backend, store, strip=strip, prefix=prefix, eolmode=eolmode |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2393 ) |
7151
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
2394 finally: |
10203
6e26e3c2083f
patch: explicitely close input patch files when leaving
Patrick Mezard <pmezard@gmail.com>
parents:
10135
diff
changeset
|
2395 if fp != patchobj: |
6e26e3c2083f
patch: explicitely close input patch files when leaving
Patrick Mezard <pmezard@gmail.com>
parents:
10135
diff
changeset
|
2396 fp.close() |
14564
65f4512e40e4
patch: turn patch() touched files dict into a set
Patrick Mezard <pmezard@gmail.com>
parents:
14535
diff
changeset
|
2397 files.update(backend.close()) |
14452
ee574cfd0c32
patch: use temporary files to handle intermediate copies
Patrick Mezard <pmezard@gmail.com>
parents:
14451
diff
changeset
|
2398 store.close() |
7151
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
2399 if ret < 0: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2400 raise PatchError(_(b'patch failed to apply')) |
7151
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
2401 return ret > 0 |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
2402 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2403 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2404 def internalpatch( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2405 ui, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2406 repo, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2407 patchobj, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2408 strip, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2409 prefix=b'', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2410 files=None, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2411 eolmode=b'strict', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2412 similarity=0, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2413 ): |
14611
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
2414 """use builtin patch to apply <patchobj> to the working directory. |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
2415 returns whether patch was applied with fuzz factor.""" |
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
2416 backend = workingbackend(ui, repo, similarity) |
24254
60c279ab7bd3
patch.internalpatch: accept a prefix parameter
Siddharth Agarwal <sid0@fb.com>
parents:
24253
diff
changeset
|
2417 return patchbackend(ui, backend, patchobj, strip, prefix, files, eolmode) |
14611
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
2418 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2419 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2420 def patchrepo( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2421 ui, repo, ctx, store, patchobj, strip, prefix, files=None, eolmode=b'strict' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2422 ): |
14611
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
2423 backend = repobackend(ui, repo, ctx, store) |
24260
76225ab5a5da
cmdutil.tryimportone: allow importing relative patches with --bypass
Siddharth Agarwal <sid0@fb.com>
parents:
24259
diff
changeset
|
2424 return patchbackend(ui, backend, patchobj, strip, prefix, files, eolmode) |
14611
adbf5e7df96d
import: add --bypass option
Patrick Mezard <pmezard@gmail.com>
parents:
14609
diff
changeset
|
2425 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2426 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2427 def patch( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2428 ui, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2429 repo, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2430 patchname, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2431 strip=1, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2432 prefix=b'', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2433 files=None, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2434 eolmode=b'strict', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2435 similarity=0, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2436 ): |
8810
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
2437 """Apply <patchname> to the working directory. |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
2438 |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
2439 'eolmode' specifies how end of lines should be handled. It can be: |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
2440 - 'strict': inputs are read in binary mode, EOLs are preserved |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
2441 - 'crlf': EOLs are ignored when patching and reset to CRLF |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
2442 - 'lf': EOLs are ignored when patching and reset to LF |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
2443 - None: get it from user settings, default to 'strict' |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
2444 'eolmode' is ignored when using an external patcher program. |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
2445 |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
2446 Returns whether patch was applied with fuzz factor. |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
2447 """ |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2448 patcher = ui.config(b'ui', b'patch') |
9683
5c8651e2f5e0
patch: don't use mutable object as default argument
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9682
diff
changeset
|
2449 if files is None: |
14564
65f4512e40e4
patch: turn patch() touched files dict into a set
Patrick Mezard <pmezard@gmail.com>
parents:
14535
diff
changeset
|
2450 files = set() |
21553
bee0e1cffdd3
import: add --partial flag to create a changeset despite failed hunks
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20972
diff
changeset
|
2451 if patcher: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2452 return _externalpatch( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2453 ui, repo, patcher, patchname, strip, files, similarity |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2454 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2455 return internalpatch( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2456 ui, repo, patchname, strip, prefix, files, eolmode, similarity |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2457 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2458 |
7151
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
2459 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2460 def changedfiles(ui, repo, patchpath, strip=1, prefix=b''): |
14351
d54f9bbcc640
patch: add lexists() to backends, use it in selectfile()
Patrick Mezard <pmezard@gmail.com>
parents:
14350
diff
changeset
|
2461 backend = fsbackend(ui, repo.root) |
35062
1706eae096e2
patch: accept prefix argument to changedfiles() helper
Martin von Zweigbergk <martinvonz@google.com>
parents:
34968
diff
changeset
|
2462 prefix = _canonprefix(repo, prefix) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2463 with open(patchpath, b'rb') as fp: |
14255
576256a81cb6
patch: introduce changedfiles
Idan Kamara <idankk86@gmail.com>
parents:
14240
diff
changeset
|
2464 changed = set() |
576256a81cb6
patch: introduce changedfiles
Idan Kamara <idankk86@gmail.com>
parents:
14240
diff
changeset
|
2465 for state, values in iterhunks(fp): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2466 if state == b'file': |
14388
37c997d21752
patch: stop handling hunkless git blocks out of stream
Patrick Mezard <pmezard@gmail.com>
parents:
14387
diff
changeset
|
2467 afile, bfile, first_hunk, gp = values |
37c997d21752
patch: stop handling hunkless git blocks out of stream
Patrick Mezard <pmezard@gmail.com>
parents:
14387
diff
changeset
|
2468 if gp: |
35062
1706eae096e2
patch: accept prefix argument to changedfiles() helper
Martin von Zweigbergk <martinvonz@google.com>
parents:
34968
diff
changeset
|
2469 gp.path = pathtransform(gp.path, strip - 1, prefix)[1] |
14566
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
2470 if gp.oldpath: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2471 gp.oldpath = pathtransform( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2472 gp.oldpath, strip - 1, prefix |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2473 )[1] |
14566
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
2474 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2475 gp = makepatchmeta( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2476 backend, afile, bfile, first_hunk, strip, prefix |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2477 ) |
14566
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
2478 changed.add(gp.path) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2479 if gp.op == b'RENAME': |
14566
d0c2cc11e611
patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents:
14565
diff
changeset
|
2480 changed.add(gp.oldpath) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2481 elif state not in (b'hunk', b'git'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2482 raise error.Abort(_(b'unsupported parser state: %s') % state) |
14255
576256a81cb6
patch: introduce changedfiles
Idan Kamara <idankk86@gmail.com>
parents:
14240
diff
changeset
|
2483 return changed |
576256a81cb6
patch: introduce changedfiles
Idan Kamara <idankk86@gmail.com>
parents:
14240
diff
changeset
|
2484 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2485 |
10189
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
2486 class GitDiffRequired(Exception): |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
2487 pass |
7198
df79ee9b6278
patch: extract local function addmodehdr
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7186
diff
changeset
|
2488 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2489 |
38587
b62000a28812
diffutil: remove diffopts() in favor of diffallopts()
Yuya Nishihara <yuya@tcha.org>
parents:
38562
diff
changeset
|
2490 diffopts = diffutil.diffallopts |
38562
c88d2c9b00dd
diffutil: extract diff options code into a dedicated util-module
Boris Feld <boris.feld@octobus.net>
parents:
38493
diff
changeset
|
2491 diffallopts = diffutil.diffallopts |
c88d2c9b00dd
diffutil: extract diff options code into a dedicated util-module
Boris Feld <boris.feld@octobus.net>
parents:
38493
diff
changeset
|
2492 difffeatureopts = diffutil.difffeatureopts |
10615
3bb438ce4458
patch/diff: move diff related code next to each other
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10611
diff
changeset
|
2493 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2494 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2495 def diff( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2496 repo, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2497 node1=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2498 node2=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2499 match=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2500 changes=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2501 opts=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2502 losedatafn=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2503 pathfn=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2504 copy=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2505 copysourcematch=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2506 hunksfilterfn=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2507 ): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45877
diff
changeset
|
2508 """yields diff of changes to files between two nodes, or node and |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
2509 working directory. |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
2510 |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
2511 if node1 is None, use first dirstate parent instead. |
10189
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
2512 if node2 is None, compare node1 with working directory. |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
2513 |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
2514 losedatafn(**kwarg) is a callable run when opts.upgrade=True and |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
2515 every time some change cannot be represented with the current |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
2516 patch format. Return False to upgrade to git patch format, True to |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
2517 accept the loss or raise an exception to abort the diff. It is |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
2518 called with the name of current file being diffed as 'fn'. If set |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
2519 to None, patches will always be upgraded to git format when |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
2520 necessary. |
12167
d2c5b0927c28
diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents:
12144
diff
changeset
|
2521 |
d2c5b0927c28
diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents:
12144
diff
changeset
|
2522 prefix is a filename prefix that is prepended to all filenames on |
d2c5b0927c28
diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents:
12144
diff
changeset
|
2523 display (used for subrepos). |
24417
f2e1e097cda1
patch.diff: add support for diffs relative to a subdirectory
Siddharth Agarwal <sid0@fb.com>
parents:
24416
diff
changeset
|
2524 |
f2e1e097cda1
patch.diff: add support for diffs relative to a subdirectory
Siddharth Agarwal <sid0@fb.com>
parents:
24416
diff
changeset
|
2525 relroot, if not empty, must be normalized with a trailing /. Any match |
29422
40d53d4b5925
patch: allow copy information to be passed in
Henrik Stuart <henriks@unity3d.com>
parents:
29341
diff
changeset
|
2526 patterns that fall outside it will be ignored. |
40d53d4b5925
patch: allow copy information to be passed in
Henrik Stuart <henriks@unity3d.com>
parents:
29341
diff
changeset
|
2527 |
40d53d4b5925
patch: allow copy information to be passed in
Henrik Stuart <henriks@unity3d.com>
parents:
29341
diff
changeset
|
2528 copy, if not empty, should contain mappings {dst@y: src@x} of copy |
34856
890afefa7296
diff: pass a diff hunks filter function from changeset_printer to patch.diff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
34855
diff
changeset
|
2529 information. |
890afefa7296
diff: pass a diff hunks filter function from changeset_printer to patch.diff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
34855
diff
changeset
|
2530 |
41620
74f53d3bd685
patch: accept second matcher that applies only to copy sources (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
41619
diff
changeset
|
2531 if copysourcematch is not None, then copy sources will be filtered by this |
74f53d3bd685
patch: accept second matcher that applies only to copy sources (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
41619
diff
changeset
|
2532 matcher |
74f53d3bd685
patch: accept second matcher that applies only to copy sources (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
41619
diff
changeset
|
2533 |
34856
890afefa7296
diff: pass a diff hunks filter function from changeset_printer to patch.diff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
34855
diff
changeset
|
2534 hunksfilterfn, if not None, should be a function taking a filectx and |
890afefa7296
diff: pass a diff hunks filter function from changeset_printer to patch.diff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
34855
diff
changeset
|
2535 hunks generator that may yield filtered hunks. |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45877
diff
changeset
|
2536 """ |
41618
e834f6f6f221
patch: pass in context objects into diffhunks() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
41534
diff
changeset
|
2537 if not node1 and not node2: |
e834f6f6f221
patch: pass in context objects into diffhunks() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
41534
diff
changeset
|
2538 node1 = repo.dirstate.p1() |
e834f6f6f221
patch: pass in context objects into diffhunks() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
41534
diff
changeset
|
2539 |
e834f6f6f221
patch: pass in context objects into diffhunks() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
41534
diff
changeset
|
2540 ctx1 = repo[node1] |
e834f6f6f221
patch: pass in context objects into diffhunks() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
41534
diff
changeset
|
2541 ctx2 = repo[node2] |
e834f6f6f221
patch: pass in context objects into diffhunks() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
41534
diff
changeset
|
2542 |
34855
35c6a54ec1ff
diff: also yield file context objects in patch.trydiff() (API)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
34566
diff
changeset
|
2543 for fctx1, fctx2, hdr, hunks in diffhunks( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2544 repo, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2545 ctx1=ctx1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2546 ctx2=ctx2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2547 match=match, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2548 changes=changes, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2549 opts=opts, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2550 losedatafn=losedatafn, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2551 pathfn=pathfn, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2552 copy=copy, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2553 copysourcematch=copysourcematch, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2554 ): |
34856
890afefa7296
diff: pass a diff hunks filter function from changeset_printer to patch.diff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
34855
diff
changeset
|
2555 if hunksfilterfn is not None: |
34908
907ff34e1460
log: add an assertion about fctx not being None in patch.diff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
34856
diff
changeset
|
2556 # If the file has been removed, fctx2 is None; but this should |
907ff34e1460
log: add an assertion about fctx not being None in patch.diff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
34856
diff
changeset
|
2557 # not occur here since we catch removed files early in |
35888
c8e2d6ed1f9e
cmdutil: drop aliases for logcmdutil functions (API)
Yuya Nishihara <yuya@tcha.org>
parents:
35850
diff
changeset
|
2558 # logcmdutil.getlinerangerevs() for 'hg log -L'. |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2559 assert ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2560 fctx2 is not None |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2561 ), b'fctx2 unexpectly None in diff hunks filtering' |
34856
890afefa7296
diff: pass a diff hunks filter function from changeset_printer to patch.diff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
34855
diff
changeset
|
2562 hunks = hunksfilterfn(fctx2, hunks) |
44759
e58422afbc74
diff: re-establish linear runtime performance
Elmar Bartel <elb_hg@leo.org>
parents:
44452
diff
changeset
|
2563 text = b''.join(b''.join(hlines) for hrange, hlines in hunks) |
34561
fe6125ebdf91
patch: rename "header" variable into "hdr" in diff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
34521
diff
changeset
|
2564 if hdr and (text or len(hdr) > 1): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2565 yield b'\n'.join(hdr) + b'\n' |
31274
a8023a64c40d
patch: add a diffhunks function yielding (diffheaders, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31273
diff
changeset
|
2566 if text: |
a8023a64c40d
patch: add a diffhunks function yielding (diffheaders, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31273
diff
changeset
|
2567 yield text |
a8023a64c40d
patch: add a diffhunks function yielding (diffheaders, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31273
diff
changeset
|
2568 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2569 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2570 def diffhunks( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2571 repo, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2572 ctx1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2573 ctx2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2574 match=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2575 changes=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2576 opts=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2577 losedatafn=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2578 pathfn=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2579 copy=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2580 copysourcematch=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2581 ): |
31274
a8023a64c40d
patch: add a diffhunks function yielding (diffheaders, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31273
diff
changeset
|
2582 """Yield diff of changes to files in the form of (`header`, `hunks`) tuples |
a8023a64c40d
patch: add a diffhunks function yielding (diffheaders, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31273
diff
changeset
|
2583 where `header` is a list of diff headers and `hunks` is an iterable of |
a8023a64c40d
patch: add a diffhunks function yielding (diffheaders, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31273
diff
changeset
|
2584 (`hunkrange`, `hunklines`) tuples. |
a8023a64c40d
patch: add a diffhunks function yielding (diffheaders, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31273
diff
changeset
|
2585 |
a8023a64c40d
patch: add a diffhunks function yielding (diffheaders, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31273
diff
changeset
|
2586 See diff() for the meaning of parameters. |
a8023a64c40d
patch: add a diffhunks function yielding (diffheaders, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31273
diff
changeset
|
2587 """ |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
2588 |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
2589 if opts is None: |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
2590 opts = mdiff.defaultopts |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
2591 |
9123
360f61c2919f
Make patch.diff filelog cache LRU of 20 files. Fixes issue1738.
Brendan Cully <brendan@kublai.com>
parents:
8891
diff
changeset
|
2592 def lrugetfilectx(): |
360f61c2919f
Make patch.diff filelog cache LRU of 20 files. Fixes issue1738.
Brendan Cully <brendan@kublai.com>
parents:
8891
diff
changeset
|
2593 cache = {} |
25113
0ca8410ea345
util: drop alias for collections.deque
Martin von Zweigbergk <martinvonz@google.com>
parents:
24845
diff
changeset
|
2594 order = collections.deque() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2595 |
9123
360f61c2919f
Make patch.diff filelog cache LRU of 20 files. Fixes issue1738.
Brendan Cully <brendan@kublai.com>
parents:
8891
diff
changeset
|
2596 def getfilectx(f, ctx): |
360f61c2919f
Make patch.diff filelog cache LRU of 20 files. Fixes issue1738.
Brendan Cully <brendan@kublai.com>
parents:
8891
diff
changeset
|
2597 fctx = ctx.filectx(f, filelog=cache.get(f)) |
360f61c2919f
Make patch.diff filelog cache LRU of 20 files. Fixes issue1738.
Brendan Cully <brendan@kublai.com>
parents:
8891
diff
changeset
|
2598 if f not in cache: |
360f61c2919f
Make patch.diff filelog cache LRU of 20 files. Fixes issue1738.
Brendan Cully <brendan@kublai.com>
parents:
8891
diff
changeset
|
2599 if len(cache) > 20: |
16803
107a3270a24a
cleanup: use the deque type where appropriate
Bryan O'Sullivan <bryano@fb.com>
parents:
16705
diff
changeset
|
2600 del cache[order.popleft()] |
9684
618af2034ca6
patch: use the public ctx API instead of the internals
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9683
diff
changeset
|
2601 cache[f] = fctx.filelog() |
9123
360f61c2919f
Make patch.diff filelog cache LRU of 20 files. Fixes issue1738.
Brendan Cully <brendan@kublai.com>
parents:
8891
diff
changeset
|
2602 else: |
360f61c2919f
Make patch.diff filelog cache LRU of 20 files. Fixes issue1738.
Brendan Cully <brendan@kublai.com>
parents:
8891
diff
changeset
|
2603 order.remove(f) |
360f61c2919f
Make patch.diff filelog cache LRU of 20 files. Fixes issue1738.
Brendan Cully <brendan@kublai.com>
parents:
8891
diff
changeset
|
2604 order.append(f) |
360f61c2919f
Make patch.diff filelog cache LRU of 20 files. Fixes issue1738.
Brendan Cully <brendan@kublai.com>
parents:
8891
diff
changeset
|
2605 return fctx |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2606 |
9123
360f61c2919f
Make patch.diff filelog cache LRU of 20 files. Fixes issue1738.
Brendan Cully <brendan@kublai.com>
parents:
8891
diff
changeset
|
2607 return getfilectx |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2608 |
9123
360f61c2919f
Make patch.diff filelog cache LRU of 20 files. Fixes issue1738.
Brendan Cully <brendan@kublai.com>
parents:
8891
diff
changeset
|
2609 getfilectx = lrugetfilectx() |
2934
2f190e998eb3
Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents:
2933
diff
changeset
|
2610 |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
2611 if not changes: |
38773
59af0c7d103f
patch: use ctx1.status(ctx2) instead of repo.status(ctx1, ctx2)
Martin von Zweigbergk <martinvonz@google.com>
parents:
38630
diff
changeset
|
2612 changes = ctx1.status(ctx2, match=match) |
43649
d649de29f1ff
patch: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents:
43506
diff
changeset
|
2613 if isinstance(changes, list): |
d649de29f1ff
patch: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents:
43506
diff
changeset
|
2614 modified, added, removed = changes[:3] |
d649de29f1ff
patch: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents:
43506
diff
changeset
|
2615 else: |
d649de29f1ff
patch: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents:
43506
diff
changeset
|
2616 modified, added, removed = ( |
d649de29f1ff
patch: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents:
43506
diff
changeset
|
2617 changes.modified, |
d649de29f1ff
patch: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents:
43506
diff
changeset
|
2618 changes.added, |
d649de29f1ff
patch: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents:
43506
diff
changeset
|
2619 changes.removed, |
d649de29f1ff
patch: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents:
43506
diff
changeset
|
2620 ) |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
2621 |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
2622 if not modified and not added and not removed: |
10189
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
2623 return [] |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
2624 |
24306
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
24269
diff
changeset
|
2625 if repo.ui.debugflag: |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
24269
diff
changeset
|
2626 hexfunc = hex |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
24269
diff
changeset
|
2627 else: |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
24269
diff
changeset
|
2628 hexfunc = short |
21833
c1ceec0c8cb4
patch: use ctx.node() instead of bare node variable
Sean Farley <sean.michael.farley@gmail.com>
parents:
21790
diff
changeset
|
2629 revs = [hexfunc(node) for node in [ctx1.node(), ctx2.node()] if node] |
10189
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
2630 |
29422
40d53d4b5925
patch: allow copy information to be passed in
Henrik Stuart <henriks@unity3d.com>
parents:
29341
diff
changeset
|
2631 if copy is None: |
40d53d4b5925
patch: allow copy information to be passed in
Henrik Stuart <henriks@unity3d.com>
parents:
29341
diff
changeset
|
2632 copy = {} |
40d53d4b5925
patch: allow copy information to be passed in
Henrik Stuart <henriks@unity3d.com>
parents:
29341
diff
changeset
|
2633 if opts.git or opts.upgrade: |
40d53d4b5925
patch: allow copy information to be passed in
Henrik Stuart <henriks@unity3d.com>
parents:
29341
diff
changeset
|
2634 copy = copies.pathcopies(ctx1, ctx2, match=match) |
10189
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
2635 |
41620
74f53d3bd685
patch: accept second matcher that applies only to copy sources (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
41619
diff
changeset
|
2636 if copysourcematch: |
74f53d3bd685
patch: accept second matcher that applies only to copy sources (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
41619
diff
changeset
|
2637 # filter out copies where source side isn't inside the matcher |
41499
a5d8824483ba
diff: drop duplicate filter of copies by destination
Martin von Zweigbergk <martinvonz@google.com>
parents:
41498
diff
changeset
|
2638 # (copies.pathcopies() already filtered out the destination) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2639 copy = { |
43106
d783f945a701
py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43104
diff
changeset
|
2640 dst: src |
d783f945a701
py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43104
diff
changeset
|
2641 for dst, src in pycompat.iteritems(copy) |
d783f945a701
py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43104
diff
changeset
|
2642 if copysourcematch(src) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2643 } |
24417
f2e1e097cda1
patch.diff: add support for diffs relative to a subdirectory
Siddharth Agarwal <sid0@fb.com>
parents:
24416
diff
changeset
|
2644 |
27900
27572a5cc409
diff: move status fixup earlier, out of _filepairs()
Martin von Zweigbergk <martinvonz@google.com>
parents:
27796
diff
changeset
|
2645 modifiedset = set(modified) |
27572a5cc409
diff: move status fixup earlier, out of _filepairs()
Martin von Zweigbergk <martinvonz@google.com>
parents:
27796
diff
changeset
|
2646 addedset = set(added) |
27901
29c8e35d3283
diff: don't crash when merged-in addition was removed (issue4786)
Martin von Zweigbergk <martinvonz@google.com>
parents:
27900
diff
changeset
|
2647 removedset = set(removed) |
27900
27572a5cc409
diff: move status fixup earlier, out of _filepairs()
Martin von Zweigbergk <martinvonz@google.com>
parents:
27796
diff
changeset
|
2648 for f in modified: |
27572a5cc409
diff: move status fixup earlier, out of _filepairs()
Martin von Zweigbergk <martinvonz@google.com>
parents:
27796
diff
changeset
|
2649 if f not in ctx1: |
27572a5cc409
diff: move status fixup earlier, out of _filepairs()
Martin von Zweigbergk <martinvonz@google.com>
parents:
27796
diff
changeset
|
2650 # Fix up added, since merged-in additions appear as |
27572a5cc409
diff: move status fixup earlier, out of _filepairs()
Martin von Zweigbergk <martinvonz@google.com>
parents:
27796
diff
changeset
|
2651 # modifications during merges |
27572a5cc409
diff: move status fixup earlier, out of _filepairs()
Martin von Zweigbergk <martinvonz@google.com>
parents:
27796
diff
changeset
|
2652 modifiedset.remove(f) |
27572a5cc409
diff: move status fixup earlier, out of _filepairs()
Martin von Zweigbergk <martinvonz@google.com>
parents:
27796
diff
changeset
|
2653 addedset.add(f) |
27901
29c8e35d3283
diff: don't crash when merged-in addition was removed (issue4786)
Martin von Zweigbergk <martinvonz@google.com>
parents:
27900
diff
changeset
|
2654 for f in removed: |
29c8e35d3283
diff: don't crash when merged-in addition was removed (issue4786)
Martin von Zweigbergk <martinvonz@google.com>
parents:
27900
diff
changeset
|
2655 if f not in ctx1: |
29c8e35d3283
diff: don't crash when merged-in addition was removed (issue4786)
Martin von Zweigbergk <martinvonz@google.com>
parents:
27900
diff
changeset
|
2656 # Merged-in additions that are then removed are reported as removed. |
29c8e35d3283
diff: don't crash when merged-in addition was removed (issue4786)
Martin von Zweigbergk <martinvonz@google.com>
parents:
27900
diff
changeset
|
2657 # They are not in ctx1, so We don't want to show them in the diff. |
29c8e35d3283
diff: don't crash when merged-in addition was removed (issue4786)
Martin von Zweigbergk <martinvonz@google.com>
parents:
27900
diff
changeset
|
2658 removedset.remove(f) |
27900
27572a5cc409
diff: move status fixup earlier, out of _filepairs()
Martin von Zweigbergk <martinvonz@google.com>
parents:
27796
diff
changeset
|
2659 modified = sorted(modifiedset) |
27572a5cc409
diff: move status fixup earlier, out of _filepairs()
Martin von Zweigbergk <martinvonz@google.com>
parents:
27796
diff
changeset
|
2660 added = sorted(addedset) |
27901
29c8e35d3283
diff: don't crash when merged-in addition was removed (issue4786)
Martin von Zweigbergk <martinvonz@google.com>
parents:
27900
diff
changeset
|
2661 removed = sorted(removedset) |
35589
3328d53254d9
py3: use list() to get a list of items using dict.items()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35582
diff
changeset
|
2662 for dst, src in list(copy.items()): |
27902
51b6ce257e0a
diff: don't crash when merged-in addition is copied
Martin von Zweigbergk <martinvonz@google.com>
parents:
27901
diff
changeset
|
2663 if src not in ctx1: |
51b6ce257e0a
diff: don't crash when merged-in addition is copied
Martin von Zweigbergk <martinvonz@google.com>
parents:
27901
diff
changeset
|
2664 # Files merged in during a merge and then copied/renamed are |
51b6ce257e0a
diff: don't crash when merged-in addition is copied
Martin von Zweigbergk <martinvonz@google.com>
parents:
27901
diff
changeset
|
2665 # reported as copies. We want to show them in the diff as additions. |
51b6ce257e0a
diff: don't crash when merged-in addition is copied
Martin von Zweigbergk <martinvonz@google.com>
parents:
27901
diff
changeset
|
2666 del copy[dst] |
27900
27572a5cc409
diff: move status fixup earlier, out of _filepairs()
Martin von Zweigbergk <martinvonz@google.com>
parents:
27796
diff
changeset
|
2667 |
37764
5e67c20915a7
diff: invoke the file prefetch hook
Matt Harbison <matt_harbison@yahoo.com>
parents:
37732
diff
changeset
|
2668 prefetchmatch = scmutil.matchfiles( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2669 repo, list(modifiedset | addedset | removedset) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2670 ) |
45072
a56ba57c837d
scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44759
diff
changeset
|
2671 revmatches = [ |
a56ba57c837d
scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44759
diff
changeset
|
2672 (ctx1.rev(), prefetchmatch), |
a56ba57c837d
scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44759
diff
changeset
|
2673 (ctx2.rev(), prefetchmatch), |
a56ba57c837d
scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44759
diff
changeset
|
2674 ] |
a56ba57c837d
scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
44759
diff
changeset
|
2675 scmutil.prefetchfiles(repo, revmatches) |
37764
5e67c20915a7
diff: invoke the file prefetch hook
Matt Harbison <matt_harbison@yahoo.com>
parents:
37732
diff
changeset
|
2676 |
17299
e51d4aedace9
check-code: indent 4 spaces in py files
Mads Kiilerich <mads@kiilerich.com>
parents:
16834
diff
changeset
|
2677 def difffn(opts, losedata): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2678 return trydiff( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2679 repo, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2680 revs, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2681 ctx1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2682 ctx2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2683 modified, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2684 added, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2685 removed, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2686 copy, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2687 getfilectx, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2688 opts, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2689 losedata, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2690 pathfn, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2691 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2692 |
10189
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
2693 if opts.upgrade and not opts.git: |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
2694 try: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2695 |
10189
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
2696 def losedata(fn): |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
2697 if not losedatafn or not losedatafn(fn=fn): |
16687
e34106fa0dc3
cleanup: "raise SomeException()" -> "raise SomeException"
Brodie Rao <brodie@sf.io>
parents:
16686
diff
changeset
|
2698 raise GitDiffRequired |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2699 |
10189
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
2700 # Buffer the whole output until we are sure it can be generated |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
2701 return list(difffn(opts.copy(git=False), losedata)) |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
2702 except GitDiffRequired: |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
2703 return difffn(opts.copy(git=True), None) |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
2704 else: |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
2705 return difffn(opts, None) |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
2706 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2707 |
37731
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2708 def diffsinglehunk(hunklines): |
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2709 """yield tokens for a list of lines in a single hunk""" |
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2710 for line in hunklines: |
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2711 # chomp |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2712 chompline = line.rstrip(b'\r\n') |
37731
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2713 # highlight tabs and trailing whitespace |
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2714 stripline = chompline.rstrip() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2715 if line.startswith(b'-'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2716 label = b'diff.deleted' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2717 elif line.startswith(b'+'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2718 label = b'diff.inserted' |
37731
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2719 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2720 raise error.ProgrammingError(b'unexpected hunk line: %s' % line) |
37731
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2721 for token in tabsplitter.findall(stripline): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2722 if token.startswith(b'\t'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2723 yield (token, b'diff.tab') |
37731
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2724 else: |
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2725 yield (token, label) |
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2726 |
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2727 if chompline != stripline: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2728 yield (chompline[len(stripline) :], b'diff.trailingwhitespace') |
37731
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2729 if chompline != line: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2730 yield (line[len(chompline) :], b'') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2731 |
37731
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2732 |
37732
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2733 def diffsinglehunkinline(hunklines): |
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2734 """yield tokens for a list of lines in a single hunk, with inline colors""" |
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2735 # prepare deleted, and inserted content |
46020
210f9b8d7bbd
diff: do not concatenate immutable bytes while building a/b bodies (issue6445)
Yuya Nishihara <yuya@tcha.org>
parents:
45154
diff
changeset
|
2736 a = bytearray() |
210f9b8d7bbd
diff: do not concatenate immutable bytes while building a/b bodies (issue6445)
Yuya Nishihara <yuya@tcha.org>
parents:
45154
diff
changeset
|
2737 b = bytearray() |
37732
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2738 for line in hunklines: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2739 if line[0:1] == b'-': |
37732
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2740 a += line[1:] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2741 elif line[0:1] == b'+': |
37732
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2742 b += line[1:] |
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2743 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2744 raise error.ProgrammingError(b'unexpected hunk line: %s' % line) |
37732
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2745 # fast path: if either side is empty, use diffsinglehunk |
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2746 if not a or not b: |
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2747 for t in diffsinglehunk(hunklines): |
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2748 yield t |
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2749 return |
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2750 # re-split the content into words |
46020
210f9b8d7bbd
diff: do not concatenate immutable bytes while building a/b bodies (issue6445)
Yuya Nishihara <yuya@tcha.org>
parents:
45154
diff
changeset
|
2751 al = wordsplitter.findall(bytes(a)) |
210f9b8d7bbd
diff: do not concatenate immutable bytes while building a/b bodies (issue6445)
Yuya Nishihara <yuya@tcha.org>
parents:
45154
diff
changeset
|
2752 bl = wordsplitter.findall(bytes(b)) |
37732
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2753 # re-arrange the words to lines since the diff algorithm is line-based |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2754 aln = [s if s == b'\n' else s + b'\n' for s in al] |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2755 bln = [s if s == b'\n' else s + b'\n' for s in bl] |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2756 an = b''.join(aln) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2757 bn = b''.join(bln) |
37732
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2758 # run the diff algorithm, prepare atokens and btokens |
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2759 atokens = [] |
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2760 btokens = [] |
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2761 blocks = mdiff.allblocks(an, bn, lines1=aln, lines2=bln) |
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2762 for (a1, a2, b1, b2), btype in blocks: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2763 changed = btype == b'!' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2764 for token in mdiff.splitnewlines(b''.join(al[a1:a2])): |
37732
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2765 atokens.append((changed, token)) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2766 for token in mdiff.splitnewlines(b''.join(bl[b1:b2])): |
37732
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2767 btokens.append((changed, token)) |
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2768 |
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2769 # yield deleted tokens, then inserted ones |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2770 for prefix, label, tokens in [ |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2771 (b'-', b'diff.deleted', atokens), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2772 (b'+', b'diff.inserted', btokens), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2773 ]: |
37732
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2774 nextisnewline = True |
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2775 for changed, token in tokens: |
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2776 if nextisnewline: |
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2777 yield (prefix, label) |
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2778 nextisnewline = False |
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2779 # special handling line end |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2780 isendofline = token.endswith(b'\n') |
37732
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2781 if isendofline: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2782 chomp = token[:-1] # chomp |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2783 if chomp.endswith(b'\r'): |
38630
e1987261dd05
patch: don't separate \r and \n when colorizing diff output
Sune Foldager <cryo@cyanite.org>
parents:
38588
diff
changeset
|
2784 chomp = chomp[:-1] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2785 endofline = token[len(chomp) :] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2786 token = chomp.rstrip() # detect spaces at the end |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2787 endspaces = chomp[len(token) :] |
37732
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2788 # scan tabs |
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2789 for maybetab in tabsplitter.findall(token): |
40282 | 2790 if b'\t' == maybetab[0:1]: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2791 currentlabel = b'diff.tab' |
37732
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2792 else: |
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2793 if changed: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2794 currentlabel = label + b'.changed' |
37732
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2795 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2796 currentlabel = label + b'.unchanged' |
37732
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2797 yield (maybetab, currentlabel) |
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2798 if isendofline: |
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2799 if endspaces: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2800 yield (endspaces, b'diff.trailingwhitespace') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2801 yield (endofline, b'') |
37732
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2802 nextisnewline = True |
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2803 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2804 |
10818
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
2805 def difflabel(func, *args, **kw): |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
2806 '''yields 2-tuples of (output, label) based on the output of func()''' |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
2807 if kw.get('opts') and kw['opts'].worddiff: |
37732
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2808 dodiffhunk = diffsinglehunkinline |
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2809 else: |
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2810 dodiffhunk = diffsinglehunk |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2811 headprefixes = [ |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2812 (b'diff', b'diff.diffline'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2813 (b'copy', b'diff.extended'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2814 (b'rename', b'diff.extended'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2815 (b'old', b'diff.extended'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2816 (b'new', b'diff.extended'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2817 (b'deleted', b'diff.extended'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2818 (b'index', b'diff.extended'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2819 (b'similarity', b'diff.extended'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2820 (b'---', b'diff.file_a'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2821 (b'+++', b'diff.file_b'), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2822 ] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2823 textprefixes = [ |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2824 (b'@', b'diff.hunk'), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2825 # - and + are handled by diffsinglehunk |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2826 ] |
15201
2c4fdee4d1a8
diff: enhance highlighting with color (issue3034)
Kirill Elagin <kirelagin@gmail.com>
parents:
15159
diff
changeset
|
2827 head = False |
37731
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2828 |
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2829 # buffers a hunk, i.e. adjacent "-", "+" lines without other changes. |
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2830 hunkbuffer = [] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2831 |
37731
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2832 def consumehunkbuffer(): |
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2833 if hunkbuffer: |
37732
35632d392279
patch: implement a new worddiff algorithm
Jun Wu <quark@fb.com>
parents:
37731
diff
changeset
|
2834 for token in dodiffhunk(hunkbuffer): |
37731
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2835 yield token |
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2836 hunkbuffer[:] = [] |
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2837 |
10818
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
2838 for chunk in func(*args, **kw): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2839 lines = chunk.split(b'\n') |
37730
8d730f96e792
patch: move yielding "\n" to the end of loop
Jun Wu <quark@fb.com>
parents:
37621
diff
changeset
|
2840 linecount = len(lines) |
10818
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
2841 for i, line in enumerate(lines): |
15201
2c4fdee4d1a8
diff: enhance highlighting with color (issue3034)
Kirill Elagin <kirelagin@gmail.com>
parents:
15159
diff
changeset
|
2842 if head: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2843 if line.startswith(b'@'): |
15201
2c4fdee4d1a8
diff: enhance highlighting with color (issue3034)
Kirill Elagin <kirelagin@gmail.com>
parents:
15159
diff
changeset
|
2844 head = False |
2c4fdee4d1a8
diff: enhance highlighting with color (issue3034)
Kirill Elagin <kirelagin@gmail.com>
parents:
15159
diff
changeset
|
2845 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2846 if line and not line.startswith( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2847 (b' ', b'+', b'-', b'@', b'\\') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2848 ): |
15201
2c4fdee4d1a8
diff: enhance highlighting with color (issue3034)
Kirill Elagin <kirelagin@gmail.com>
parents:
15159
diff
changeset
|
2849 head = True |
22460
c343557a8442
patch: enable diff.tab markup for the color extension
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
22296
diff
changeset
|
2850 diffline = False |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2851 if not head and line and line.startswith((b'+', b'-')): |
22460
c343557a8442
patch: enable diff.tab markup for the color extension
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
22296
diff
changeset
|
2852 diffline = True |
c343557a8442
patch: enable diff.tab markup for the color extension
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
22296
diff
changeset
|
2853 |
15201
2c4fdee4d1a8
diff: enhance highlighting with color (issue3034)
Kirill Elagin <kirelagin@gmail.com>
parents:
15159
diff
changeset
|
2854 prefixes = textprefixes |
2c4fdee4d1a8
diff: enhance highlighting with color (issue3034)
Kirill Elagin <kirelagin@gmail.com>
parents:
15159
diff
changeset
|
2855 if head: |
2c4fdee4d1a8
diff: enhance highlighting with color (issue3034)
Kirill Elagin <kirelagin@gmail.com>
parents:
15159
diff
changeset
|
2856 prefixes = headprefixes |
37731
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2857 if diffline: |
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2858 # buffered |
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2859 bufferedline = line |
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2860 if i + 1 < linecount: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2861 bufferedline += b"\n" |
37731
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2862 hunkbuffer.append(bufferedline) |
10818
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
2863 else: |
37731
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2864 # unbuffered |
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2865 for token in consumehunkbuffer(): |
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2866 yield token |
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2867 stripline = line.rstrip() |
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2868 for prefix, label in prefixes: |
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2869 if stripline.startswith(prefix): |
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2870 yield (stripline, label) |
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2871 if line != stripline: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2872 yield ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2873 line[len(stripline) :], |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2874 b'diff.trailingwhitespace', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2875 ) |
35277
6ba79cf34f5e
patch: add within-line color diff capacity
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents:
35191
diff
changeset
|
2876 break |
37731
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2877 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2878 yield (line, b'') |
37731
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2879 if i + 1 < linecount: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2880 yield (b'\n', b'') |
37731
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2881 for token in consumehunkbuffer(): |
5471348921c1
patch: buffer lines for a same hunk
Jun Wu <quark@fb.com>
parents:
37730
diff
changeset
|
2882 yield token |
35277
6ba79cf34f5e
patch: add within-line color diff capacity
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents:
35191
diff
changeset
|
2883 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2884 |
10818
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
2885 def diffui(*args, **kw): |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
2886 '''like diff(), but yields 2-tuples of (output, label) for ui.write()''' |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
2887 return difflabel(diff, *args, **kw) |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
2888 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2889 |
27900
27572a5cc409
diff: move status fixup earlier, out of _filepairs()
Martin von Zweigbergk <martinvonz@google.com>
parents:
27796
diff
changeset
|
2890 def _filepairs(modified, added, removed, copy, opts): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45877
diff
changeset
|
2891 """generates tuples (f1, f2, copyop), where f1 is the name of the file |
24106
9cf9432a505b
trydiff: extract function that generates filename pairs
Martin von Zweigbergk <martinvonz@google.com>
parents:
24105
diff
changeset
|
2892 before and f2 is the the name after. For added files, f1 will be None, |
9cf9432a505b
trydiff: extract function that generates filename pairs
Martin von Zweigbergk <martinvonz@google.com>
parents:
24105
diff
changeset
|
2893 and for removed files, f2 will be None. copyop may be set to None, 'copy' |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45877
diff
changeset
|
2894 or 'rename' (the latter two only if opts.git is set).""" |
24106
9cf9432a505b
trydiff: extract function that generates filename pairs
Martin von Zweigbergk <martinvonz@google.com>
parents:
24105
diff
changeset
|
2895 gone = set() |
9cf9432a505b
trydiff: extract function that generates filename pairs
Martin von Zweigbergk <martinvonz@google.com>
parents:
24105
diff
changeset
|
2896 |
44452
9d2b2df2c2ba
cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents:
44247
diff
changeset
|
2897 copyto = {v: k for k, v in copy.items()} |
24106
9cf9432a505b
trydiff: extract function that generates filename pairs
Martin von Zweigbergk <martinvonz@google.com>
parents:
24105
diff
changeset
|
2898 |
9cf9432a505b
trydiff: extract function that generates filename pairs
Martin von Zweigbergk <martinvonz@google.com>
parents:
24105
diff
changeset
|
2899 addedset, removedset = set(added), set(removed) |
9cf9432a505b
trydiff: extract function that generates filename pairs
Martin von Zweigbergk <martinvonz@google.com>
parents:
24105
diff
changeset
|
2900 |
9cf9432a505b
trydiff: extract function that generates filename pairs
Martin von Zweigbergk <martinvonz@google.com>
parents:
24105
diff
changeset
|
2901 for f in sorted(modified + added + removed): |
9cf9432a505b
trydiff: extract function that generates filename pairs
Martin von Zweigbergk <martinvonz@google.com>
parents:
24105
diff
changeset
|
2902 copyop = None |
9cf9432a505b
trydiff: extract function that generates filename pairs
Martin von Zweigbergk <martinvonz@google.com>
parents:
24105
diff
changeset
|
2903 f1, f2 = f, f |
9cf9432a505b
trydiff: extract function that generates filename pairs
Martin von Zweigbergk <martinvonz@google.com>
parents:
24105
diff
changeset
|
2904 if f in addedset: |
9cf9432a505b
trydiff: extract function that generates filename pairs
Martin von Zweigbergk <martinvonz@google.com>
parents:
24105
diff
changeset
|
2905 f1 = None |
9cf9432a505b
trydiff: extract function that generates filename pairs
Martin von Zweigbergk <martinvonz@google.com>
parents:
24105
diff
changeset
|
2906 if f in copy: |
9cf9432a505b
trydiff: extract function that generates filename pairs
Martin von Zweigbergk <martinvonz@google.com>
parents:
24105
diff
changeset
|
2907 if opts.git: |
9cf9432a505b
trydiff: extract function that generates filename pairs
Martin von Zweigbergk <martinvonz@google.com>
parents:
24105
diff
changeset
|
2908 f1 = copy[f] |
9cf9432a505b
trydiff: extract function that generates filename pairs
Martin von Zweigbergk <martinvonz@google.com>
parents:
24105
diff
changeset
|
2909 if f1 in removedset and f1 not in gone: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2910 copyop = b'rename' |
24106
9cf9432a505b
trydiff: extract function that generates filename pairs
Martin von Zweigbergk <martinvonz@google.com>
parents:
24105
diff
changeset
|
2911 gone.add(f1) |
9cf9432a505b
trydiff: extract function that generates filename pairs
Martin von Zweigbergk <martinvonz@google.com>
parents:
24105
diff
changeset
|
2912 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2913 copyop = b'copy' |
24106
9cf9432a505b
trydiff: extract function that generates filename pairs
Martin von Zweigbergk <martinvonz@google.com>
parents:
24105
diff
changeset
|
2914 elif f in removedset: |
9cf9432a505b
trydiff: extract function that generates filename pairs
Martin von Zweigbergk <martinvonz@google.com>
parents:
24105
diff
changeset
|
2915 f2 = None |
9cf9432a505b
trydiff: extract function that generates filename pairs
Martin von Zweigbergk <martinvonz@google.com>
parents:
24105
diff
changeset
|
2916 if opts.git: |
9cf9432a505b
trydiff: extract function that generates filename pairs
Martin von Zweigbergk <martinvonz@google.com>
parents:
24105
diff
changeset
|
2917 # have we already reported a copy above? |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2918 if ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2919 f in copyto |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2920 and copyto[f] in addedset |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2921 and copy[copyto[f]] == f |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2922 ): |
24106
9cf9432a505b
trydiff: extract function that generates filename pairs
Martin von Zweigbergk <martinvonz@google.com>
parents:
24105
diff
changeset
|
2923 continue |
9cf9432a505b
trydiff: extract function that generates filename pairs
Martin von Zweigbergk <martinvonz@google.com>
parents:
24105
diff
changeset
|
2924 yield f1, f2, copyop |
9cf9432a505b
trydiff: extract function that generates filename pairs
Martin von Zweigbergk <martinvonz@google.com>
parents:
24105
diff
changeset
|
2925 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2926 |
45098
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
2927 def _gitindex(text): |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
2928 if not text: |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
2929 text = b"" |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
2930 l = len(text) |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
2931 s = hashutil.sha1(b'blob %d\0' % l) |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
2932 s.update(text) |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
2933 return hex(s.digest()) |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
2934 |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
2935 |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
2936 _gitmode = {b'l': b'120000', b'x': b'100755', b'': b'100644'} |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
2937 |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
2938 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2939 def trydiff( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2940 repo, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2941 revs, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2942 ctx1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2943 ctx2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2944 modified, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2945 added, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2946 removed, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2947 copy, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2948 getfilectx, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2949 opts, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2950 losedatafn, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2951 pathfn, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
2952 ): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45877
diff
changeset
|
2953 """given input data, generate a diff and yield it in blocks |
24371
8a997bd73448
patch.trydiff: add a docstring
Siddharth Agarwal <sid0@fb.com>
parents:
24346
diff
changeset
|
2954 |
8a997bd73448
patch.trydiff: add a docstring
Siddharth Agarwal <sid0@fb.com>
parents:
24346
diff
changeset
|
2955 If generating a diff would lose data like flags or binary data and |
8a997bd73448
patch.trydiff: add a docstring
Siddharth Agarwal <sid0@fb.com>
parents:
24346
diff
changeset
|
2956 losedatafn is not None, it will be called. |
8a997bd73448
patch.trydiff: add a docstring
Siddharth Agarwal <sid0@fb.com>
parents:
24346
diff
changeset
|
2957 |
41646
d4c9eebdd72d
patch: replace "prefix" and "relroot" arguments by "pathfn" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
41624
diff
changeset
|
2958 pathfn is applied to every path in the diff output. |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45877
diff
changeset
|
2959 """ |
12167
d2c5b0927c28
diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents:
12144
diff
changeset
|
2960 |
23300
f8b5c3e77d4b
patch.trydiff: add support for noprefix
Siddharth Agarwal <sid0@fb.com>
parents:
23297
diff
changeset
|
2961 if opts.noprefix: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2962 aprefix = bprefix = b'' |
23300
f8b5c3e77d4b
patch.trydiff: add support for noprefix
Siddharth Agarwal <sid0@fb.com>
parents:
23297
diff
changeset
|
2963 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2964 aprefix = b'a/' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2965 bprefix = b'b/' |
23300
f8b5c3e77d4b
patch.trydiff: add support for noprefix
Siddharth Agarwal <sid0@fb.com>
parents:
23297
diff
changeset
|
2966 |
24021
f51a822dcf3b
trydiff: remove unused argument to diffline()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24020
diff
changeset
|
2967 def diffline(f, revs): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2968 revinfo = b' '.join([b"-r %s" % rev for rev in revs]) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
2969 return b'diff %s %s' % (revinfo, f) |
17941
9a6e4d5d7ea8
diff: move diffline to patch module
Guillermo P?rez <bisho@fb.com>
parents:
17940
diff
changeset
|
2970 |
32188
776127b29a5c
diff: use fctx.size() to test empty
Jun Wu <quark@fb.com>
parents:
32187
diff
changeset
|
2971 def isempty(fctx): |
776127b29a5c
diff: use fctx.size() to test empty
Jun Wu <quark@fb.com>
parents:
32187
diff
changeset
|
2972 return fctx is None or fctx.size() == 0 |
776127b29a5c
diff: use fctx.size() to test empty
Jun Wu <quark@fb.com>
parents:
32187
diff
changeset
|
2973 |
36607
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
36447
diff
changeset
|
2974 date1 = dateutil.datestr(ctx1.date()) |
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
36447
diff
changeset
|
2975 date2 = dateutil.datestr(ctx2.date()) |
3967
dccb83241dd0
patch: use contexts for diff
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3963
diff
changeset
|
2976 |
41646
d4c9eebdd72d
patch: replace "prefix" and "relroot" arguments by "pathfn" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
41624
diff
changeset
|
2977 if not pathfn: |
d4c9eebdd72d
patch: replace "prefix" and "relroot" arguments by "pathfn" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
41624
diff
changeset
|
2978 pathfn = lambda f: f |
24416
f07047a506d1
patch.trydiff: add support for stripping a relative root
Siddharth Agarwal <sid0@fb.com>
parents:
24390
diff
changeset
|
2979 |
27900
27572a5cc409
diff: move status fixup earlier, out of _filepairs()
Martin von Zweigbergk <martinvonz@google.com>
parents:
27796
diff
changeset
|
2980 for f1, f2, copyop in _filepairs(modified, added, removed, copy, opts): |
24105
0f8baebcdbea
trydiff: read file data in only one place
Martin von Zweigbergk <martinvonz@google.com>
parents:
24104
diff
changeset
|
2981 content1 = None |
0f8baebcdbea
trydiff: read file data in only one place
Martin von Zweigbergk <martinvonz@google.com>
parents:
24104
diff
changeset
|
2982 content2 = None |
32187
e62cf13e0858
diff: use fctx.isbinary() to test binary
Jun Wu <quark@fb.com>
parents:
32068
diff
changeset
|
2983 fctx1 = None |
e62cf13e0858
diff: use fctx.isbinary() to test binary
Jun Wu <quark@fb.com>
parents:
32068
diff
changeset
|
2984 fctx2 = None |
24103
c666c85f71ba
trydiff: read flags in one place
Martin von Zweigbergk <martinvonz@google.com>
parents:
24102
diff
changeset
|
2985 flag1 = None |
c666c85f71ba
trydiff: read flags in one place
Martin von Zweigbergk <martinvonz@google.com>
parents:
24102
diff
changeset
|
2986 flag2 = None |
24107
32e8d94b9473
trydiff: transpose 'if opts.git or losedatafn' with 'if f[12]'
Martin von Zweigbergk <martinvonz@google.com>
parents:
24106
diff
changeset
|
2987 if f1: |
32187
e62cf13e0858
diff: use fctx.isbinary() to test binary
Jun Wu <quark@fb.com>
parents:
32068
diff
changeset
|
2988 fctx1 = getfilectx(f1, ctx1) |
24107
32e8d94b9473
trydiff: transpose 'if opts.git or losedatafn' with 'if f[12]'
Martin von Zweigbergk <martinvonz@google.com>
parents:
24106
diff
changeset
|
2989 if opts.git or losedatafn: |
32e8d94b9473
trydiff: transpose 'if opts.git or losedatafn' with 'if f[12]'
Martin von Zweigbergk <martinvonz@google.com>
parents:
24106
diff
changeset
|
2990 flag1 = ctx1.flags(f1) |
32e8d94b9473
trydiff: transpose 'if opts.git or losedatafn' with 'if f[12]'
Martin von Zweigbergk <martinvonz@google.com>
parents:
24106
diff
changeset
|
2991 if f2: |
32187
e62cf13e0858
diff: use fctx.isbinary() to test binary
Jun Wu <quark@fb.com>
parents:
32068
diff
changeset
|
2992 fctx2 = getfilectx(f2, ctx2) |
24107
32e8d94b9473
trydiff: transpose 'if opts.git or losedatafn' with 'if f[12]'
Martin von Zweigbergk <martinvonz@google.com>
parents:
24106
diff
changeset
|
2993 if opts.git or losedatafn: |
32e8d94b9473
trydiff: transpose 'if opts.git or losedatafn' with 'if f[12]'
Martin von Zweigbergk <martinvonz@google.com>
parents:
24106
diff
changeset
|
2994 flag2 = ctx2.flags(f2) |
32190 | 2995 # if binary is True, output "summary" or "base85", but not "text diff" |
35850
079b27b5a869
patch: avoid repeated binary checks if all files in a patch are text
Joerg Sonnenberger <joerg@bec.de>
parents:
35633
diff
changeset
|
2996 if opts.text: |
079b27b5a869
patch: avoid repeated binary checks if all files in a patch are text
Joerg Sonnenberger <joerg@bec.de>
parents:
35633
diff
changeset
|
2997 binary = False |
079b27b5a869
patch: avoid repeated binary checks if all files in a patch are text
Joerg Sonnenberger <joerg@bec.de>
parents:
35633
diff
changeset
|
2998 else: |
35951
8b6dd3922f70
patch: unify check_binary and binary flags
Yuya Nishihara <yuya@tcha.org>
parents:
35888
diff
changeset
|
2999 binary = any(f.isbinary() for f in [fctx1, fctx2] if f is not None) |
24057
696d0fd77d94
trydiff: collect all lossiness checks in one place
Martin von Zweigbergk <martinvonz@google.com>
parents:
24056
diff
changeset
|
3000 |
696d0fd77d94
trydiff: collect all lossiness checks in one place
Martin von Zweigbergk <martinvonz@google.com>
parents:
24056
diff
changeset
|
3001 if losedatafn and not opts.git: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3002 if ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3003 binary |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3004 or |
24057
696d0fd77d94
trydiff: collect all lossiness checks in one place
Martin von Zweigbergk <martinvonz@google.com>
parents:
24056
diff
changeset
|
3005 # copy/rename |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3006 f2 in copy |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3007 or |
24057
696d0fd77d94
trydiff: collect all lossiness checks in one place
Martin von Zweigbergk <martinvonz@google.com>
parents:
24056
diff
changeset
|
3008 # empty file creation |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3009 (not f1 and isempty(fctx2)) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3010 or |
24057
696d0fd77d94
trydiff: collect all lossiness checks in one place
Martin von Zweigbergk <martinvonz@google.com>
parents:
24056
diff
changeset
|
3011 # empty file deletion |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3012 (isempty(fctx1) and not f2) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3013 or |
24057
696d0fd77d94
trydiff: collect all lossiness checks in one place
Martin von Zweigbergk <martinvonz@google.com>
parents:
24056
diff
changeset
|
3014 # create with flags |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3015 (not f1 and flag2) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3016 or |
24057
696d0fd77d94
trydiff: collect all lossiness checks in one place
Martin von Zweigbergk <martinvonz@google.com>
parents:
24056
diff
changeset
|
3017 # change flags |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3018 (f1 and f2 and flag1 != flag2) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3019 ): |
24106
9cf9432a505b
trydiff: extract function that generates filename pairs
Martin von Zweigbergk <martinvonz@google.com>
parents:
24105
diff
changeset
|
3020 losedatafn(f2 or f1) |
10189
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
3021 |
41646
d4c9eebdd72d
patch: replace "prefix" and "relroot" arguments by "pathfn" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
41624
diff
changeset
|
3022 path1 = pathfn(f1 or f2) |
d4c9eebdd72d
patch: replace "prefix" and "relroot" arguments by "pathfn" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
41624
diff
changeset
|
3023 path2 = pathfn(f2 or f1) |
23998
b65637247c69
trydiff: collect header-writing in one place
Martin von Zweigbergk <martinvonz@google.com>
parents:
23997
diff
changeset
|
3024 header = [] |
24022
da63f557d0dc
trydiff: make 'revs' ignored if opts.git is set
Martin von Zweigbergk <martinvonz@google.com>
parents:
24021
diff
changeset
|
3025 if opts.git: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3026 header.append( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3027 b'diff --git %s%s %s%s' % (aprefix, path1, bprefix, path2) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3028 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3029 if not f1: # added |
45098
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3030 header.append(b'new file mode %s' % _gitmode[flag2]) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3031 elif not f2: # removed |
45098
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3032 header.append(b'deleted file mode %s' % _gitmode[flag1]) |
23998
b65637247c69
trydiff: collect header-writing in one place
Martin von Zweigbergk <martinvonz@google.com>
parents:
23997
diff
changeset
|
3033 else: # modified/copied/renamed |
45098
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3034 mode1, mode2 = _gitmode[flag1], _gitmode[flag2] |
24000
82e3324c4df9
trydiff: inline sole addmodehdr() call
Martin von Zweigbergk <martinvonz@google.com>
parents:
23999
diff
changeset
|
3035 if mode1 != mode2: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3036 header.append(b'old mode %s' % mode1) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3037 header.append(b'new mode %s' % mode2) |
24055
7f4e6b5fce03
trydiff: rename 'op' to make it more specific
Martin von Zweigbergk <martinvonz@google.com>
parents:
24025
diff
changeset
|
3038 if copyop is not None: |
30807
6381a6dbc325
patch: use opt.showsimilarity to calculate and show the similarity
Sean Farley <sean@farley.io>
parents:
30806
diff
changeset
|
3039 if opts.showsimilarity: |
6381a6dbc325
patch: use opt.showsimilarity to calculate and show the similarity
Sean Farley <sean@farley.io>
parents:
30806
diff
changeset
|
3040 sim = similar.score(ctx1[path1], ctx2[path2]) * 100 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3041 header.append(b'similarity index %d%%' % sim) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3042 header.append(b'%s from %s' % (copyop, path1)) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3043 header.append(b'%s to %s' % (copyop, path2)) |
41784
251332dbf33d
diff: make sure we output stat even when --git is not passed (issue4037) (BC)
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41759
diff
changeset
|
3044 elif revs: |
24022
da63f557d0dc
trydiff: make 'revs' ignored if opts.git is set
Martin von Zweigbergk <martinvonz@google.com>
parents:
24021
diff
changeset
|
3045 header.append(diffline(path1, revs)) |
23998
b65637247c69
trydiff: collect header-writing in one place
Martin von Zweigbergk <martinvonz@google.com>
parents:
23997
diff
changeset
|
3046 |
32189
15f10ee778f8
diff: draw a table about binary diff behaviors
Jun Wu <quark@fb.com>
parents:
32188
diff
changeset
|
3047 # fctx.is | diffopts | what to | is fctx.data() |
15f10ee778f8
diff: draw a table about binary diff behaviors
Jun Wu <quark@fb.com>
parents:
32188
diff
changeset
|
3048 # binary() | text nobinary git index | output? | outputted? |
15f10ee778f8
diff: draw a table about binary diff behaviors
Jun Wu <quark@fb.com>
parents:
32188
diff
changeset
|
3049 # ------------------------------------|---------------------------- |
15f10ee778f8
diff: draw a table about binary diff behaviors
Jun Wu <quark@fb.com>
parents:
32188
diff
changeset
|
3050 # yes | no no no * | summary | no |
15f10ee778f8
diff: draw a table about binary diff behaviors
Jun Wu <quark@fb.com>
parents:
32188
diff
changeset
|
3051 # yes | no no yes * | base85 | yes |
15f10ee778f8
diff: draw a table about binary diff behaviors
Jun Wu <quark@fb.com>
parents:
32188
diff
changeset
|
3052 # yes | no yes no * | summary | no |
15f10ee778f8
diff: draw a table about binary diff behaviors
Jun Wu <quark@fb.com>
parents:
32188
diff
changeset
|
3053 # yes | no yes yes 0 | summary | no |
15f10ee778f8
diff: draw a table about binary diff behaviors
Jun Wu <quark@fb.com>
parents:
32188
diff
changeset
|
3054 # yes | no yes yes >0 | summary | semi [1] |
15f10ee778f8
diff: draw a table about binary diff behaviors
Jun Wu <quark@fb.com>
parents:
32188
diff
changeset
|
3055 # yes | yes * * * | text diff | yes |
15f10ee778f8
diff: draw a table about binary diff behaviors
Jun Wu <quark@fb.com>
parents:
32188
diff
changeset
|
3056 # no | * * * * | text diff | yes |
15f10ee778f8
diff: draw a table about binary diff behaviors
Jun Wu <quark@fb.com>
parents:
32188
diff
changeset
|
3057 # [1]: hash(fctx.data()) is outputted. so fctx.data() cannot be faked |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3058 if binary and ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3059 not opts.git or (opts.git and opts.nobinary and not opts.index) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3060 ): |
32191
31f42e683321
diff: add a fast path to avoid loading binary contents
Jun Wu <quark@fb.com>
parents:
32190
diff
changeset
|
3061 # fast path: no binary content will be displayed, content1 and |
31f42e683321
diff: add a fast path to avoid loading binary contents
Jun Wu <quark@fb.com>
parents:
32190
diff
changeset
|
3062 # content2 are only used for equivalent test. cmp() could have a |
31f42e683321
diff: add a fast path to avoid loading binary contents
Jun Wu <quark@fb.com>
parents:
32190
diff
changeset
|
3063 # fast path. |
31f42e683321
diff: add a fast path to avoid loading binary contents
Jun Wu <quark@fb.com>
parents:
32190
diff
changeset
|
3064 if fctx1 is not None: |
31f42e683321
diff: add a fast path to avoid loading binary contents
Jun Wu <quark@fb.com>
parents:
32190
diff
changeset
|
3065 content1 = b'\0' |
31f42e683321
diff: add a fast path to avoid loading binary contents
Jun Wu <quark@fb.com>
parents:
32190
diff
changeset
|
3066 if fctx2 is not None: |
31f42e683321
diff: add a fast path to avoid loading binary contents
Jun Wu <quark@fb.com>
parents:
32190
diff
changeset
|
3067 if fctx1 is not None and not fctx1.cmp(fctx2): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3068 content2 = b'\0' # not different |
32191
31f42e683321
diff: add a fast path to avoid loading binary contents
Jun Wu <quark@fb.com>
parents:
32190
diff
changeset
|
3069 else: |
31f42e683321
diff: add a fast path to avoid loading binary contents
Jun Wu <quark@fb.com>
parents:
32190
diff
changeset
|
3070 content2 = b'\0\0' |
31f42e683321
diff: add a fast path to avoid loading binary contents
Jun Wu <quark@fb.com>
parents:
32190
diff
changeset
|
3071 else: |
31f42e683321
diff: add a fast path to avoid loading binary contents
Jun Wu <quark@fb.com>
parents:
32190
diff
changeset
|
3072 # normal path: load contents |
31f42e683321
diff: add a fast path to avoid loading binary contents
Jun Wu <quark@fb.com>
parents:
32190
diff
changeset
|
3073 if fctx1 is not None: |
31f42e683321
diff: add a fast path to avoid loading binary contents
Jun Wu <quark@fb.com>
parents:
32190
diff
changeset
|
3074 content1 = fctx1.data() |
31f42e683321
diff: add a fast path to avoid loading binary contents
Jun Wu <quark@fb.com>
parents:
32190
diff
changeset
|
3075 if fctx2 is not None: |
31f42e683321
diff: add a fast path to avoid loading binary contents
Jun Wu <quark@fb.com>
parents:
32190
diff
changeset
|
3076 content2 = fctx2.data() |
31f42e683321
diff: add a fast path to avoid loading binary contents
Jun Wu <quark@fb.com>
parents:
32190
diff
changeset
|
3077 |
45098
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3078 data1 = (ctx1, fctx1, path1, flag1, content1, date1) |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3079 data2 = (ctx2, fctx2, path2, flag2, content2, date2) |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3080 yield diffcontent(data1, data2, header, binary, opts) |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3081 |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3082 |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3083 def diffcontent(data1, data2, header, binary, opts): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45877
diff
changeset
|
3084 """diffs two versions of a file. |
45098
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3085 |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3086 data1 and data2 are tuples containg: |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3087 |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3088 * ctx: changeset for the file |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3089 * fctx: file context for that file |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3090 * path1: name of the file |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3091 * flag: flags of the file |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3092 * content: full content of the file (can be null in case of binary) |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3093 * date: date of the changeset |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3094 |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3095 header: the patch header |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3096 binary: whether the any of the version of file is binary or not |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3097 opts: user passed options |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3098 |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3099 It exists as a separate function so that extensions like extdiff can wrap |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3100 it and use the file content directly. |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3101 """ |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3102 |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3103 ctx1, fctx1, path1, flag1, content1, date1 = data1 |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3104 ctx2, fctx2, path2, flag2, content2, date2 = data2 |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46693
diff
changeset
|
3105 index1 = _gitindex(content1) if path1 in ctx1 else sha1nodeconstants.nullhex |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46693
diff
changeset
|
3106 index2 = _gitindex(content2) if path2 in ctx2 else sha1nodeconstants.nullhex |
45098
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3107 if binary and opts.git and not opts.nobinary: |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3108 text = mdiff.b85diff(content1, content2) |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3109 if text: |
46550
a9887f9e87aa
patch: fix a formatting issue
Sushil khanchi <sushilkhanchi97@gmail.com>
parents:
46529
diff
changeset
|
3110 header.append(b'index %s..%s' % (index1, index2)) |
45098
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3111 hunks = ((None, [text]),) |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3112 else: |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3113 if opts.git and opts.index > 0: |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3114 flag = flag1 |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3115 if flag is None: |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3116 flag = flag2 |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3117 header.append( |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3118 b'index %s..%s %s' |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3119 % ( |
46529
33350debb480
patch: make diff --git to differentiate b/w file is empty or doesn't exists
Sushil khanchi <sushilkhanchi97@gmail.com>
parents:
46246
diff
changeset
|
3120 index1[0 : opts.index], |
33350debb480
patch: make diff --git to differentiate b/w file is empty or doesn't exists
Sushil khanchi <sushilkhanchi97@gmail.com>
parents:
46246
diff
changeset
|
3121 index2[0 : opts.index], |
45098
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3122 _gitmode[flag], |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3123 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3124 ) |
45098
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3125 |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3126 uheaders, hunks = mdiff.unidiff( |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3127 content1, |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3128 date1, |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3129 content2, |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3130 date2, |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3131 path1, |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3132 path2, |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3133 binary=binary, |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3134 opts=opts, |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3135 ) |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3136 header.extend(uheaders) |
20a65e397943
patch: refactor content diffing part in separate fn so extensions can wrap
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45072
diff
changeset
|
3137 return fctx1, fctx2, header, hunks |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
3138 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3139 |
14401
7bb7be1c1385
patch: add diffstatsum helper
Matt Mackall <mpm@selenic.com>
parents:
14400
diff
changeset
|
3140 def diffstatsum(stats): |
14437
cbe13e6bdc34
patch: restore the previous output of 'diff --stat'
Steven Brown <StevenGBrown@gmail.com>
parents:
14435
diff
changeset
|
3141 maxfile, maxtotal, addtotal, removetotal, binary = 0, 0, 0, 0, False |
14401
7bb7be1c1385
patch: add diffstatsum helper
Matt Mackall <mpm@selenic.com>
parents:
14400
diff
changeset
|
3142 for f, a, r, b in stats: |
7bb7be1c1385
patch: add diffstatsum helper
Matt Mackall <mpm@selenic.com>
parents:
14400
diff
changeset
|
3143 maxfile = max(maxfile, encoding.colwidth(f)) |
14437
cbe13e6bdc34
patch: restore the previous output of 'diff --stat'
Steven Brown <StevenGBrown@gmail.com>
parents:
14435
diff
changeset
|
3144 maxtotal = max(maxtotal, a + r) |
14401
7bb7be1c1385
patch: add diffstatsum helper
Matt Mackall <mpm@selenic.com>
parents:
14400
diff
changeset
|
3145 addtotal += a |
7bb7be1c1385
patch: add diffstatsum helper
Matt Mackall <mpm@selenic.com>
parents:
14400
diff
changeset
|
3146 removetotal += r |
7bb7be1c1385
patch: add diffstatsum helper
Matt Mackall <mpm@selenic.com>
parents:
14400
diff
changeset
|
3147 binary = binary or b |
7bb7be1c1385
patch: add diffstatsum helper
Matt Mackall <mpm@selenic.com>
parents:
14400
diff
changeset
|
3148 |
14437
cbe13e6bdc34
patch: restore the previous output of 'diff --stat'
Steven Brown <StevenGBrown@gmail.com>
parents:
14435
diff
changeset
|
3149 return maxfile, maxtotal, addtotal, removetotal, binary |
14401
7bb7be1c1385
patch: add diffstatsum helper
Matt Mackall <mpm@selenic.com>
parents:
14400
diff
changeset
|
3150 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3151 |
7547
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
3152 def diffstatdata(lines): |
41532
bd3f03d8cc9f
global: use raw strings for regular expressions with escapes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41499
diff
changeset
|
3153 diffre = re.compile(br'^diff .*-r [a-z0-9]+\s(.*)$') |
13395
104c9ed93fc5
diffstat: fix parsing of filenames with spaces
Gast?n Kleiman <gaston.kleiman@gmail.com>
parents:
13112
diff
changeset
|
3154 |
14400
cd1ca2556cac
diffstatdata: no longer a generator
Matt Mackall <mpm@selenic.com>
parents:
14392
diff
changeset
|
3155 results = [] |
15363
628a4a9e411d
diffstat: be more picky when marking file as 'binary' (issue2816)
Patrick Mezard <pmezard@gmail.com>
parents:
15201
diff
changeset
|
3156 filename, adds, removes, isbinary = None, 0, 0, False |
14400
cd1ca2556cac
diffstatdata: no longer a generator
Matt Mackall <mpm@selenic.com>
parents:
14392
diff
changeset
|
3157 |
cd1ca2556cac
diffstatdata: no longer a generator
Matt Mackall <mpm@selenic.com>
parents:
14392
diff
changeset
|
3158 def addresult(): |
cd1ca2556cac
diffstatdata: no longer a generator
Matt Mackall <mpm@selenic.com>
parents:
14392
diff
changeset
|
3159 if filename: |
cd1ca2556cac
diffstatdata: no longer a generator
Matt Mackall <mpm@selenic.com>
parents:
14392
diff
changeset
|
3160 results.append((filename, adds, removes, isbinary)) |
cd1ca2556cac
diffstatdata: no longer a generator
Matt Mackall <mpm@selenic.com>
parents:
14392
diff
changeset
|
3161 |
32320
0e29ce16ec38
diffstat: properly count lines starting in '--' or '++' (issue5479)
Andrew Zwicky <andrew.zwicky@gmail.com>
parents:
32201
diff
changeset
|
3162 # inheader is used to track if a line is in the |
0e29ce16ec38
diffstat: properly count lines starting in '--' or '++' (issue5479)
Andrew Zwicky <andrew.zwicky@gmail.com>
parents:
32201
diff
changeset
|
3163 # header portion of the diff. This helps properly account |
0e29ce16ec38
diffstat: properly count lines starting in '--' or '++' (issue5479)
Andrew Zwicky <andrew.zwicky@gmail.com>
parents:
32201
diff
changeset
|
3164 # for lines that start with '--' or '++' |
0e29ce16ec38
diffstat: properly count lines starting in '--' or '++' (issue5479)
Andrew Zwicky <andrew.zwicky@gmail.com>
parents:
32201
diff
changeset
|
3165 inheader = False |
0e29ce16ec38
diffstat: properly count lines starting in '--' or '++' (issue5479)
Andrew Zwicky <andrew.zwicky@gmail.com>
parents:
32201
diff
changeset
|
3166 |
7547
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
3167 for line in lines: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3168 if line.startswith(b'diff'): |
14400
cd1ca2556cac
diffstatdata: no longer a generator
Matt Mackall <mpm@selenic.com>
parents:
14392
diff
changeset
|
3169 addresult() |
32320
0e29ce16ec38
diffstat: properly count lines starting in '--' or '++' (issue5479)
Andrew Zwicky <andrew.zwicky@gmail.com>
parents:
32201
diff
changeset
|
3170 # starting a new file diff |
0e29ce16ec38
diffstat: properly count lines starting in '--' or '++' (issue5479)
Andrew Zwicky <andrew.zwicky@gmail.com>
parents:
32201
diff
changeset
|
3171 # set numbers to 0 and reset inheader |
0e29ce16ec38
diffstat: properly count lines starting in '--' or '++' (issue5479)
Andrew Zwicky <andrew.zwicky@gmail.com>
parents:
32201
diff
changeset
|
3172 inheader = True |
15363
628a4a9e411d
diffstat: be more picky when marking file as 'binary' (issue2816)
Patrick Mezard <pmezard@gmail.com>
parents:
15201
diff
changeset
|
3173 adds, removes, isbinary = 0, 0, False |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3174 if line.startswith(b'diff --git a/'): |
20972
4e2fb0ad00a9
diff: use second filename for --stat reporting on git patches (issue4221)
Matt Mackall <mpm@selenic.com>
parents:
20869
diff
changeset
|
3175 filename = gitre.search(line).group(2) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3176 elif line.startswith(b'diff -r'): |
8761
0289f384e1e5
Generally replace "file name" with "filename" in help and comments.
timeless <timeless@gmail.com>
parents:
8632
diff
changeset
|
3177 # format: "diff -r ... -r ... filename" |
13395
104c9ed93fc5
diffstat: fix parsing of filenames with spaces
Gast?n Kleiman <gaston.kleiman@gmail.com>
parents:
13112
diff
changeset
|
3178 filename = diffre.search(line).group(1) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3179 elif line.startswith(b'@@'): |
32320
0e29ce16ec38
diffstat: properly count lines starting in '--' or '++' (issue5479)
Andrew Zwicky <andrew.zwicky@gmail.com>
parents:
32201
diff
changeset
|
3180 inheader = False |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3181 elif line.startswith(b'+') and not inheader: |
7547
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
3182 adds += 1 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3183 elif line.startswith(b'-') and not inheader: |
7547
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
3184 removes += 1 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3185 elif line.startswith(b'GIT binary patch') or line.startswith( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3186 b'Binary file' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3187 ): |
15363
628a4a9e411d
diffstat: be more picky when marking file as 'binary' (issue2816)
Patrick Mezard <pmezard@gmail.com>
parents:
15201
diff
changeset
|
3188 isbinary = True |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3189 elif line.startswith(b'rename from'): |
41401
4a33a6bf2b52
diffstat: support filenames with whitespaces on renames
Navaneeth Suresh <navaneeths1998@gmail.com>
parents:
41375
diff
changeset
|
3190 filename = line[12:] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3191 elif line.startswith(b'rename to'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3192 filename += b' => %s' % line[10:] |
14400
cd1ca2556cac
diffstatdata: no longer a generator
Matt Mackall <mpm@selenic.com>
parents:
14392
diff
changeset
|
3193 addresult() |
cd1ca2556cac
diffstatdata: no longer a generator
Matt Mackall <mpm@selenic.com>
parents:
14392
diff
changeset
|
3194 return results |
7547
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
3195 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3196 |
30407
e1677cc29da6
patch: remove unused git parameter from patch.diffstat()
Henning Schild <henning@hennsch.de>
parents:
30397
diff
changeset
|
3197 def diffstat(lines, width=80): |
7547
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
3198 output = [] |
14402
f03f08240c32
patch: use diffstatsum in diffstat
Matt Mackall <mpm@selenic.com>
parents:
14401
diff
changeset
|
3199 stats = diffstatdata(lines) |
14437
cbe13e6bdc34
patch: restore the previous output of 'diff --stat'
Steven Brown <StevenGBrown@gmail.com>
parents:
14435
diff
changeset
|
3200 maxname, maxtotal, totaladds, totalremoves, hasbinary = diffstatsum(stats) |
7547
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
3201 |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
3202 countwidth = len(str(maxtotal)) |
9642
7d17794f08a9
diffstat: with --git, mark binary files with Bin
Brodie Rao <me+hg@dackz.net>
parents:
9639
diff
changeset
|
3203 if hasbinary and countwidth < 3: |
7d17794f08a9
diffstat: with --git, mark binary files with Bin
Brodie Rao <me+hg@dackz.net>
parents:
9639
diff
changeset
|
3204 countwidth = 3 |
9330
be2a13153372
diffstat: scale adds/removes proportionally to graph width
Brodie Rao <me+hg@dackz.net>
parents:
9328
diff
changeset
|
3205 graphwidth = width - countwidth - maxname - 6 |
7547
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
3206 if graphwidth < 10: |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
3207 graphwidth = 10 |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
3208 |
9330
be2a13153372
diffstat: scale adds/removes proportionally to graph width
Brodie Rao <me+hg@dackz.net>
parents:
9328
diff
changeset
|
3209 def scale(i): |
be2a13153372
diffstat: scale adds/removes proportionally to graph width
Brodie Rao <me+hg@dackz.net>
parents:
9328
diff
changeset
|
3210 if maxtotal <= graphwidth: |
be2a13153372
diffstat: scale adds/removes proportionally to graph width
Brodie Rao <me+hg@dackz.net>
parents:
9328
diff
changeset
|
3211 return i |
be2a13153372
diffstat: scale adds/removes proportionally to graph width
Brodie Rao <me+hg@dackz.net>
parents:
9328
diff
changeset
|
3212 # If diffstat runs out of room it doesn't print anything, |
be2a13153372
diffstat: scale adds/removes proportionally to graph width
Brodie Rao <me+hg@dackz.net>
parents:
9328
diff
changeset
|
3213 # which isn't very useful, so always print at least one + or - |
be2a13153372
diffstat: scale adds/removes proportionally to graph width
Brodie Rao <me+hg@dackz.net>
parents:
9328
diff
changeset
|
3214 # if there were at least some changes. |
be2a13153372
diffstat: scale adds/removes proportionally to graph width
Brodie Rao <me+hg@dackz.net>
parents:
9328
diff
changeset
|
3215 return max(i * graphwidth // maxtotal, int(bool(i))) |
7547
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
3216 |
14402
f03f08240c32
patch: use diffstatsum in diffstat
Matt Mackall <mpm@selenic.com>
parents:
14401
diff
changeset
|
3217 for filename, adds, removes, isbinary in stats: |
15363
628a4a9e411d
diffstat: be more picky when marking file as 'binary' (issue2816)
Patrick Mezard <pmezard@gmail.com>
parents:
15201
diff
changeset
|
3218 if isbinary: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3219 count = b'Bin' |
9642
7d17794f08a9
diffstat: with --git, mark binary files with Bin
Brodie Rao <me+hg@dackz.net>
parents:
9639
diff
changeset
|
3220 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3221 count = b'%d' % (adds + removes) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3222 pluses = b'+' * scale(adds) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3223 minuses = b'-' * scale(removes) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3224 output.append( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3225 b' %s%s | %*s %s%s\n' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3226 % ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3227 filename, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3228 b' ' * (maxname - encoding.colwidth(filename)), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3229 countwidth, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3230 count, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3231 pluses, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3232 minuses, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3233 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3234 ) |
7547
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
3235 |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
3236 if stats: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3237 output.append( |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43106
diff
changeset
|
3238 _(b' %d files changed, %d insertions(+), %d deletions(-)\n') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3239 % (len(stats), totaladds, totalremoves) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3240 ) |
7547
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
3241 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3242 return b''.join(output) |
10818
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
3243 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43066
diff
changeset
|
3244 |
10818
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
3245 def diffstatui(*args, **kw): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45877
diff
changeset
|
3246 """like diffstat(), but yields 2-tuples of (output, label) for |
10818
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
3247 ui.write() |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45877
diff
changeset
|
3248 """ |
10818
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
3249 |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
3250 for line in diffstat(*args, **kw).splitlines(): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3251 if line and line[-1] in b'+-': |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3252 name, graph = line.rsplit(b' ', 1) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3253 yield (name + b' ', b'') |
33096
d9962854a4a2
py3: add b'' to make the regex pattern bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32990
diff
changeset
|
3254 m = re.search(br'\++', graph) |
10818
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
3255 if m: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3256 yield (m.group(0), b'diffstat.inserted') |
33096
d9962854a4a2
py3: add b'' to make the regex pattern bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32990
diff
changeset
|
3257 m = re.search(br'-+', graph) |
10818
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
3258 if m: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3259 yield (m.group(0), b'diffstat.deleted') |
10818
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
3260 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3261 yield (line, b'') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
3262 yield (b'\n', b'') |