Mercurial > hg-stable
annotate mercurial/patch.py @ 11019:4fe28bdc27be
patch: make "unable to strip away" message less confusing
author | Mads Kiilerich <mads@kiilerich.com> |
---|---|
date | Mon, 26 Apr 2010 13:21:02 +0200 |
parents | 17cf756ba25d |
children | dd157720a8ee |
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 |
10965
7faef79a89c7
patch: move mercurial-specific imports after stdlib imports
Augie Fackler <durin42@gmail.com>
parents:
10905
diff
changeset
|
9 import cStringIO, email.Parser, os, re |
7faef79a89c7
patch: move mercurial-specific imports after stdlib imports
Augie Fackler <durin42@gmail.com>
parents:
10905
diff
changeset
|
10 import tempfile, zlib |
7faef79a89c7
patch: move mercurial-specific imports after stdlib imports
Augie Fackler <durin42@gmail.com>
parents:
10905
diff
changeset
|
11 |
3891 | 12 from i18n import _ |
6211
f89fd07fc51d
Expand import * to allow Pyflakes to find problems
Joel Rosdahl <joel@rosdahl.net>
parents:
6179
diff
changeset
|
13 from node import hex, nullid, short |
7873
4a4c7f6a5912
cleanup: drop unused imports
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7860
diff
changeset
|
14 import base85, cmdutil, mdiff, util, diffhelpers, copies |
2866
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
15 |
7199
dd891d0d97a3
patch: consolidate two different regexes for parsing of git diffs
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7198
diff
changeset
|
16 gitre = re.compile('diff --git a/(.*) b/(.*)') |
dd891d0d97a3
patch: consolidate two different regexes for parsing of git diffs
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7198
diff
changeset
|
17 |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
18 class PatchError(Exception): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
19 pass |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
20 |
4900
e56c7e05c7e6
patch.py: re-add the ability to use an external patch program
Bryan O'Sullivan <bos@serpentine.com>
parents:
4899
diff
changeset
|
21 class NoHunks(PatchError): |
e56c7e05c7e6
patch.py: re-add the ability to use an external patch program
Bryan O'Sullivan <bos@serpentine.com>
parents:
4899
diff
changeset
|
22 pass |
e56c7e05c7e6
patch.py: re-add the ability to use an external patch program
Bryan O'Sullivan <bos@serpentine.com>
parents:
4899
diff
changeset
|
23 |
2933
439fd013360d
Move import's working dir update code into patch.updatedir
Brendan Cully <brendan@kublai.com>
parents:
2922
diff
changeset
|
24 # helper functions |
439fd013360d
Move import's working dir update code into patch.updatedir
Brendan Cully <brendan@kublai.com>
parents:
2922
diff
changeset
|
25 |
7505
fe0e02f952b0
When applying a git diff, ensure that the target dir exists for new files
Stefan Rusek <stefan@rusek.org>
parents:
7402
diff
changeset
|
26 def copyfile(src, dst, basedir): |
fe0e02f952b0
When applying a git diff, ensure that the target dir exists for new files
Stefan Rusek <stefan@rusek.org>
parents:
7402
diff
changeset
|
27 abssrc, absdst = [util.canonpath(basedir, basedir, x) for x in [src, dst]] |
2933
439fd013360d
Move import's working dir update code into patch.updatedir
Brendan Cully <brendan@kublai.com>
parents:
2922
diff
changeset
|
28 if os.path.exists(absdst): |
439fd013360d
Move import's working dir update code into patch.updatedir
Brendan Cully <brendan@kublai.com>
parents:
2922
diff
changeset
|
29 raise util.Abort(_("cannot create %s: destination already exists") % |
439fd013360d
Move import's working dir update code into patch.updatedir
Brendan Cully <brendan@kublai.com>
parents:
2922
diff
changeset
|
30 dst) |
439fd013360d
Move import's working dir update code into patch.updatedir
Brendan Cully <brendan@kublai.com>
parents:
2922
diff
changeset
|
31 |
7505
fe0e02f952b0
When applying a git diff, ensure that the target dir exists for new files
Stefan Rusek <stefan@rusek.org>
parents:
7402
diff
changeset
|
32 dstdir = os.path.dirname(absdst) |
fe0e02f952b0
When applying a git diff, ensure that the target dir exists for new files
Stefan Rusek <stefan@rusek.org>
parents:
7402
diff
changeset
|
33 if dstdir and not os.path.isdir(dstdir): |
fe0e02f952b0
When applying a git diff, ensure that the target dir exists for new files
Stefan Rusek <stefan@rusek.org>
parents:
7402
diff
changeset
|
34 try: |
fe0e02f952b0
When applying a git diff, ensure that the target dir exists for new files
Stefan Rusek <stefan@rusek.org>
parents:
7402
diff
changeset
|
35 os.makedirs(dstdir) |
7507
8e76e9f67cb3
patch: catch only IOError from makedirs()
Patrick Mezard <pmezard@gmail.com>
parents:
7505
diff
changeset
|
36 except IOError: |
7505
fe0e02f952b0
When applying a git diff, ensure that the target dir exists for new files
Stefan Rusek <stefan@rusek.org>
parents:
7402
diff
changeset
|
37 raise util.Abort( |
fe0e02f952b0
When applying a git diff, ensure that the target dir exists for new files
Stefan Rusek <stefan@rusek.org>
parents:
7402
diff
changeset
|
38 _("cannot create %s: unable to create destination directory") |
7561
fa23d169a895
patch: kill some trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7517
diff
changeset
|
39 % dst) |
3629
4cfb72bcb978
util: add copyfile function
Matt Mackall <mpm@selenic.com>
parents:
3588
diff
changeset
|
40 |
4cfb72bcb978
util: add copyfile function
Matt Mackall <mpm@selenic.com>
parents:
3588
diff
changeset
|
41 util.copyfile(abssrc, absdst) |
2933
439fd013360d
Move import's working dir update code into patch.updatedir
Brendan Cully <brendan@kublai.com>
parents:
2922
diff
changeset
|
42 |
439fd013360d
Move import's working dir update code into patch.updatedir
Brendan Cully <brendan@kublai.com>
parents:
2922
diff
changeset
|
43 # public functions |
439fd013360d
Move import's working dir update code into patch.updatedir
Brendan Cully <brendan@kublai.com>
parents:
2922
diff
changeset
|
44 |
10384
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
45 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
|
46 '''return an iterator of individual patches from a stream''' |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
47 def 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
|
48 if inheader and line[0] in (' ', '\t'): |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
49 # continuation |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
50 return True |
10883
196908117c27
patch: don't look for headers in diff lines
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
10748
diff
changeset
|
51 if line[0] in (' ', '-', '+'): |
196908117c27
patch: don't look for headers in diff lines
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
10748
diff
changeset
|
52 # 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
|
53 return 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
|
54 l = line.split(': ', 1) |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
55 return len(l) == 2 and ' ' not in l[0] |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
56 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
57 def chunk(lines): |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
58 return cStringIO.StringIO(''.join(lines)) |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
59 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
60 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
|
61 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
|
62 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
63 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
|
64 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
|
65 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
|
66 if not inheader and line.startswith('# HG changeset patch'): |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
67 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
|
68 cur = [] |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
69 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
|
70 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
71 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
|
72 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
73 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
|
74 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
|
75 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
76 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
|
77 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
|
78 if line.startswith('From '): |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
79 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
|
80 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
|
81 cur = [] |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
82 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
83 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
|
84 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
85 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
|
86 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
|
87 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
|
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 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
|
90 def 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
|
91 fp = cStringIO.StringIO() |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
92 g = email.Generator.Generator(fp, mangle_from_=False) |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
93 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
|
94 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
|
95 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
|
96 |
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 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
|
98 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
|
99 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
|
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 m = email.Parser.Parser().parse(c) |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
102 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
|
103 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
|
104 else: |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
105 ok_types = ('text/plain', 'text/x-diff', 'text/x-patch') |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
106 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
|
107 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
|
108 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
|
109 continue |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
110 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
|
111 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
112 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
|
113 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
|
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 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
|
117 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
|
118 cur = [] |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
119 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
|
120 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
|
121 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
|
122 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
123 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
|
124 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
125 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
|
126 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
|
127 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
128 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
|
129 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
|
130 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
131 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
|
132 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
|
133 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
|
134 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
135 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
|
136 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
|
137 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
138 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
|
139 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
|
140 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
|
141 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
|
142 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
|
143 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
144 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
|
145 cur = [] |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
146 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
147 mimeheaders = ['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
|
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 if not hasattr(stream, 'next'): |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
150 # 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
|
151 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
|
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 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
|
154 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
|
155 if line.startswith('# HG changeset patch'): |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
156 return 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
|
157 elif line.startswith('From '): |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
158 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
|
159 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
|
160 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
|
161 if line.split(':', 1)[0].lower() in mimeheaders: |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
162 # 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
|
163 return mimesplit(stream, cur) |
10501
a27af7229850
import: if in doubt, consume stream until start of diff
Brendan Cully <brendan@kublai.com>
parents:
10467
diff
changeset
|
164 elif line.startswith('--- ') and inheader: |
a27af7229850
import: if in doubt, consume stream until start of diff
Brendan Cully <brendan@kublai.com>
parents:
10467
diff
changeset
|
165 # 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
|
166 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
|
167 # 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
|
168 |
832f35386067
import: import each patch in a file or stream as a separate change
Brendan Cully <brendan@kublai.com>
parents:
10282
diff
changeset
|
169 # 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
|
170 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
|
171 |
2866
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
172 def extract(ui, fileobj): |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
173 '''extract patch from data read from fileobj. |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
174 |
4263 | 175 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
|
176 |
4263 | 177 return tuple (filename, message, user, date, node, p1, p2). |
178 Any item in the returned tuple can be None. If filename is None, | |
179 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
|
180 |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
181 # 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
|
182 # (this heuristic is borrowed from quilt) |
7736
fb0776fe3e38
patch: turned strings with backslashes into raw strings
Martin Geisler <mg@daimi.au.dk>
parents:
7670
diff
changeset
|
183 diffre = re.compile(r'^(?:Index:[ \t]|diff[ \t]|RCS file: |' |
fb0776fe3e38
patch: turned strings with backslashes into raw strings
Martin Geisler <mg@daimi.au.dk>
parents:
7670
diff
changeset
|
184 r'retrieving revision [0-9]+(\.[0-9]+)*$|' |
10736
a528a1046dba
patch: second line of a context diff starts with '--- ', not '+++ '
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10729
diff
changeset
|
185 r'---[ \t].*?^\+\+\+[ \t]|' |
a528a1046dba
patch: second line of a context diff starts with '--- ', not '+++ '
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10729
diff
changeset
|
186 r'\*\*\*[ \t].*?^---[ \t])', re.MULTILINE|re.DOTALL) |
2866
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
187 |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
188 fd, tmpname = tempfile.mkstemp(prefix='hg-patch-') |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
189 tmpfp = os.fdopen(fd, 'w') |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
190 try: |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
191 msg = email.Parser.Parser().parse(fileobj) |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
192 |
4777
5ee5cbfceff3
patch.extract: do not prepend subject if the description already starts with it
Brendan Cully <brendan@kublai.com>
parents:
4659
diff
changeset
|
193 subject = msg['Subject'] |
2866
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
194 user = msg['From'] |
9573
b8352a3617f3
patch: do not swallow header-like patch first line (issue1859)
Patrick Mezard <pmezard@gmail.com>
parents:
9243
diff
changeset
|
195 if not subject and not user: |
b8352a3617f3
patch: do not swallow header-like patch first line (issue1859)
Patrick Mezard <pmezard@gmail.com>
parents:
9243
diff
changeset
|
196 # Not an email, restore parsed headers if any |
b8352a3617f3
patch: do not swallow header-like patch first line (issue1859)
Patrick Mezard <pmezard@gmail.com>
parents:
9243
diff
changeset
|
197 subject = '\n'.join(': '.join(h) for h in msg.items()) + '\n' |
b8352a3617f3
patch: do not swallow header-like patch first line (issue1859)
Patrick Mezard <pmezard@gmail.com>
parents:
9243
diff
changeset
|
198 |
5418
9b469bdb1ce1
patch: fix git sendmail handling without proper mail headers
Patrick Mezard <pmezard@gmail.com>
parents:
5403
diff
changeset
|
199 gitsendmail = 'git-send-email' in msg.get('X-Mailer', '') |
2866
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
200 # should try to parse msg['Date'] |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
201 date = None |
4263 | 202 nodeid = None |
4443
eff2eefdb65a
Add ability to parse branch information to hg import
Eric Hopper <hopper@omnifarious.org>
parents:
4436
diff
changeset
|
203 branch = None |
4263 | 204 parents = [] |
2866
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
205 |
4777
5ee5cbfceff3
patch.extract: do not prepend subject if the description already starts with it
Brendan Cully <brendan@kublai.com>
parents:
4659
diff
changeset
|
206 if subject: |
5ee5cbfceff3
patch.extract: do not prepend subject if the description already starts with it
Brendan Cully <brendan@kublai.com>
parents:
4659
diff
changeset
|
207 if subject.startswith('[PATCH'): |
5ee5cbfceff3
patch.extract: do not prepend subject if the description already starts with it
Brendan Cully <brendan@kublai.com>
parents:
4659
diff
changeset
|
208 pend = subject.find(']') |
4208
bd9b84b9a84b
Make [PATCH] removal slightly more robust
Brendan Cully <brendan@kublai.com>
parents:
4201
diff
changeset
|
209 if pend >= 0: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
210 subject = subject[pend + 1:].lstrip() |
4777
5ee5cbfceff3
patch.extract: do not prepend subject if the description already starts with it
Brendan Cully <brendan@kublai.com>
parents:
4659
diff
changeset
|
211 subject = subject.replace('\n\t', ' ') |
5ee5cbfceff3
patch.extract: do not prepend subject if the description already starts with it
Brendan Cully <brendan@kublai.com>
parents:
4659
diff
changeset
|
212 ui.debug('Subject: %s\n' % subject) |
2866
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
213 if user: |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
214 ui.debug('From: %s\n' % user) |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
215 diffs_seen = 0 |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
216 ok_types = ('text/plain', 'text/x-diff', 'text/x-patch') |
4900
e56c7e05c7e6
patch.py: re-add the ability to use an external patch program
Bryan O'Sullivan <bos@serpentine.com>
parents:
4899
diff
changeset
|
217 message = '' |
2866
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
218 for part in msg.walk(): |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
219 content_type = part.get_content_type() |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
220 ui.debug('Content-Type: %s\n' % content_type) |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
221 if content_type not in ok_types: |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
222 continue |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
223 payload = part.get_payload(decode=True) |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
224 m = diffre.search(payload) |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
225 if m: |
4220
1253703853a8
git-send-email compatibility: stop reading changelog after ^---$
Brendan Cully <brendan@kublai.com>
parents:
4208
diff
changeset
|
226 hgpatch = False |
1253703853a8
git-send-email compatibility: stop reading changelog after ^---$
Brendan Cully <brendan@kublai.com>
parents:
4208
diff
changeset
|
227 ignoretext = False |
1253703853a8
git-send-email compatibility: stop reading changelog after ^---$
Brendan Cully <brendan@kublai.com>
parents:
4208
diff
changeset
|
228 |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9393
diff
changeset
|
229 ui.debug('found patch at byte %d\n' % m.start(0)) |
2866
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
230 diffs_seen += 1 |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
231 cfp = cStringIO.StringIO() |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
232 for line in payload[:m.start(0)].splitlines(): |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
233 if line.startswith('# HG changeset patch'): |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9393
diff
changeset
|
234 ui.debug('patch generated by hg export\n') |
2866
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
235 hgpatch = True |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
236 # drop earlier commit message content |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
237 cfp.seek(0) |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
238 cfp.truncate() |
4778
e321f16f4eac
patch.extract: fix test-import breakage introduced in the previous changeset
Brendan Cully <brendan@kublai.com>
parents:
4777
diff
changeset
|
239 subject = None |
2866
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
240 elif hgpatch: |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
241 if line.startswith('# User '): |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
242 user = line[7:] |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
243 ui.debug('From: %s\n' % user) |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
244 elif line.startswith("# Date "): |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
245 date = line[7:] |
4443
eff2eefdb65a
Add ability to parse branch information to hg import
Eric Hopper <hopper@omnifarious.org>
parents:
4436
diff
changeset
|
246 elif line.startswith("# Branch "): |
eff2eefdb65a
Add ability to parse branch information to hg import
Eric Hopper <hopper@omnifarious.org>
parents:
4436
diff
changeset
|
247 branch = line[9:] |
4263 | 248 elif line.startswith("# Node ID "): |
249 nodeid = line[10:] | |
250 elif line.startswith("# Parent "): | |
251 parents.append(line[10:]) | |
5418
9b469bdb1ce1
patch: fix git sendmail handling without proper mail headers
Patrick Mezard <pmezard@gmail.com>
parents:
5403
diff
changeset
|
252 elif line == '---' and gitsendmail: |
4220
1253703853a8
git-send-email compatibility: stop reading changelog after ^---$
Brendan Cully <brendan@kublai.com>
parents:
4208
diff
changeset
|
253 ignoretext = True |
1253703853a8
git-send-email compatibility: stop reading changelog after ^---$
Brendan Cully <brendan@kublai.com>
parents:
4208
diff
changeset
|
254 if not line.startswith('# ') and not ignoretext: |
2866
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
255 cfp.write(line) |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
256 cfp.write('\n') |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
257 message = cfp.getvalue() |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
258 if tmpfp: |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
259 tmpfp.write(payload) |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
260 if not payload.endswith('\n'): |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
261 tmpfp.write('\n') |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
262 elif not diffs_seen and message and content_type == 'text/plain': |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
263 message += '\n' + payload |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
264 except: |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
265 tmpfp.close() |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
266 os.unlink(tmpname) |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
267 raise |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
268 |
4777
5ee5cbfceff3
patch.extract: do not prepend subject if the description already starts with it
Brendan Cully <brendan@kublai.com>
parents:
4659
diff
changeset
|
269 if subject and not message.startswith(subject): |
5ee5cbfceff3
patch.extract: do not prepend subject if the description already starts with it
Brendan Cully <brendan@kublai.com>
parents:
4659
diff
changeset
|
270 message = '%s\n%s' % (subject, message) |
2866
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
271 tmpfp.close() |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
272 if not diffs_seen: |
2893e51407a4
commands.import: refactor patch parsing into patch.extract.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2865
diff
changeset
|
273 os.unlink(tmpname) |
4443
eff2eefdb65a
Add ability to parse branch information to hg import
Eric Hopper <hopper@omnifarious.org>
parents:
4436
diff
changeset
|
274 return None, message, user, date, branch, None, None, None |
4263 | 275 p1 = parents and parents.pop(0) or None |
276 p2 = parents and parents.pop(0) or None | |
4443
eff2eefdb65a
Add ability to parse branch information to hg import
Eric Hopper <hopper@omnifarious.org>
parents:
4436
diff
changeset
|
277 return tmpname, message, user, date, branch, nodeid, p1, p2 |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
278 |
3716
ab5600428b08
handle files with both git binary patches and copy/rename ops
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3702
diff
changeset
|
279 GP_PATCH = 1 << 0 # we have to run patch |
ab5600428b08
handle files with both git binary patches and copy/rename ops
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3702
diff
changeset
|
280 GP_FILTER = 1 << 1 # there's some copy/rename operation |
ab5600428b08
handle files with both git binary patches and copy/rename ops
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3702
diff
changeset
|
281 GP_BINARY = 1 << 2 # there's a binary patch |
ab5600428b08
handle files with both git binary patches and copy/rename ops
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3702
diff
changeset
|
282 |
8778
c5f36402daad
use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8761
diff
changeset
|
283 class patchmeta(object): |
7148
7d84e5b00e29
patch: extract and rename gitpatch into patchmeta, document
Patrick Mezard <pmezard@gmail.com>
parents:
7147
diff
changeset
|
284 """Patched file metadata |
7d84e5b00e29
patch: extract and rename gitpatch into patchmeta, document
Patrick Mezard <pmezard@gmail.com>
parents:
7147
diff
changeset
|
285 |
7d84e5b00e29
patch: extract and rename gitpatch into patchmeta, document
Patrick Mezard <pmezard@gmail.com>
parents:
7147
diff
changeset
|
286 '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
|
287 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
|
288 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
|
289 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
|
290 '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
|
291 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
|
292 """ |
7d84e5b00e29
patch: extract and rename gitpatch into patchmeta, document
Patrick Mezard <pmezard@gmail.com>
parents:
7147
diff
changeset
|
293 def __init__(self, path): |
7d84e5b00e29
patch: extract and rename gitpatch into patchmeta, document
Patrick Mezard <pmezard@gmail.com>
parents:
7147
diff
changeset
|
294 self.path = path |
7d84e5b00e29
patch: extract and rename gitpatch into patchmeta, document
Patrick Mezard <pmezard@gmail.com>
parents:
7147
diff
changeset
|
295 self.oldpath = None |
7d84e5b00e29
patch: extract and rename gitpatch into patchmeta, document
Patrick Mezard <pmezard@gmail.com>
parents:
7147
diff
changeset
|
296 self.mode = None |
7d84e5b00e29
patch: extract and rename gitpatch into patchmeta, document
Patrick Mezard <pmezard@gmail.com>
parents:
7147
diff
changeset
|
297 self.op = 'MODIFY' |
7d84e5b00e29
patch: extract and rename gitpatch into patchmeta, document
Patrick Mezard <pmezard@gmail.com>
parents:
7147
diff
changeset
|
298 self.lineno = 0 |
7d84e5b00e29
patch: extract and rename gitpatch into patchmeta, document
Patrick Mezard <pmezard@gmail.com>
parents:
7147
diff
changeset
|
299 self.binary = False |
7d84e5b00e29
patch: extract and rename gitpatch into patchmeta, document
Patrick Mezard <pmezard@gmail.com>
parents:
7147
diff
changeset
|
300 |
7149
01a056c54385
patch: patchmeta gives (islink, isexec) tuple instead of int mode
Patrick Mezard <pmezard@gmail.com>
parents:
7148
diff
changeset
|
301 def setmode(self, mode): |
01a056c54385
patch: patchmeta gives (islink, isexec) tuple instead of int mode
Patrick Mezard <pmezard@gmail.com>
parents:
7148
diff
changeset
|
302 islink = mode & 020000 |
01a056c54385
patch: patchmeta gives (islink, isexec) tuple instead of int mode
Patrick Mezard <pmezard@gmail.com>
parents:
7148
diff
changeset
|
303 isexec = mode & 0100 |
01a056c54385
patch: patchmeta gives (islink, isexec) tuple instead of int mode
Patrick Mezard <pmezard@gmail.com>
parents:
7148
diff
changeset
|
304 self.mode = (islink, isexec) |
01a056c54385
patch: patchmeta gives (islink, isexec) tuple instead of int mode
Patrick Mezard <pmezard@gmail.com>
parents:
7148
diff
changeset
|
305 |
11018
17cf756ba25d
patch: descriptive patchmeta.__repr__ to help debugging
Mads Kiilerich <mads@kiilerich.com>
parents:
10966
diff
changeset
|
306 def __repr__(self): |
17cf756ba25d
patch: descriptive patchmeta.__repr__ to help debugging
Mads Kiilerich <mads@kiilerich.com>
parents:
10966
diff
changeset
|
307 return "<patchmeta %s %r>" % (self.op, self.path) |
17cf756ba25d
patch: descriptive patchmeta.__repr__ to help debugging
Mads Kiilerich <mads@kiilerich.com>
parents:
10966
diff
changeset
|
308 |
7152
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
309 def readgitpatch(lr): |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
310 """extract git-style metadata about patches from <patchname>""" |
3223
53e843840349
Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3199
diff
changeset
|
311 |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
312 # Filter patch for git information |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
313 gp = None |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
314 gitpatches = [] |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
315 # Can have a git patch with only metadata, causing patch to complain |
3716
ab5600428b08
handle files with both git binary patches and copy/rename ops
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3702
diff
changeset
|
316 dopatch = 0 |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
317 |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
318 lineno = 0 |
7152
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
319 for line in lr: |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
320 lineno += 1 |
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
|
321 line = line.rstrip(' \r\n') |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
322 if line.startswith('diff --git'): |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
323 m = gitre.match(line) |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
324 if m: |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
325 if gp: |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
326 gitpatches.append(gp) |
9392
039bce1b505f
patch: readgitpatch: remove unused variable 'src'
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9331
diff
changeset
|
327 dst = m.group(2) |
7148
7d84e5b00e29
patch: extract and rename gitpatch into patchmeta, document
Patrick Mezard <pmezard@gmail.com>
parents:
7147
diff
changeset
|
328 gp = patchmeta(dst) |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
329 gp.lineno = lineno |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
330 elif gp: |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
331 if line.startswith('--- '): |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
332 if gp.op in ('COPY', 'RENAME'): |
3716
ab5600428b08
handle files with both git binary patches and copy/rename ops
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3702
diff
changeset
|
333 dopatch |= GP_FILTER |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
334 gitpatches.append(gp) |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
335 gp = None |
3716
ab5600428b08
handle files with both git binary patches and copy/rename ops
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3702
diff
changeset
|
336 dopatch |= GP_PATCH |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
337 continue |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
338 if line.startswith('rename from '): |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
339 gp.op = '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
|
340 gp.oldpath = line[12:] |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
341 elif line.startswith('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
|
342 gp.path = line[10:] |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
343 elif line.startswith('copy from '): |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
344 gp.op = '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
|
345 gp.oldpath = line[10:] |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
346 elif line.startswith('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
|
347 gp.path = line[8:] |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
348 elif line.startswith('deleted file'): |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
349 gp.op = 'DELETE' |
7517
49f34b43cf90
patch: handle git patches that remove symlinks (issue1438)
Brendan Cully <brendan@kublai.com>
parents:
7507
diff
changeset
|
350 # is the deleted file a symlink? |
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
|
351 gp.setmode(int(line[-6:], 8)) |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
352 elif line.startswith('new file mode '): |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
353 gp.op = '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
|
354 gp.setmode(int(line[-6:], 8)) |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
355 elif line.startswith('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
|
356 gp.setmode(int(line[-6:], 8)) |
3367
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
357 elif line.startswith('GIT binary patch'): |
3716
ab5600428b08
handle files with both git binary patches and copy/rename ops
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3702
diff
changeset
|
358 dopatch |= GP_BINARY |
3367
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
359 gp.binary = True |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
360 if gp: |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
361 gitpatches.append(gp) |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
362 |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
363 if not gitpatches: |
3716
ab5600428b08
handle files with both git binary patches and copy/rename ops
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3702
diff
changeset
|
364 dopatch = GP_PATCH |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
365 |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
366 return (dopatch, gitpatches) |
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
367 |
8891
5fe8dc75aa4a
patch: use new style class in linereader
Simon Heimberg <simohe@besonet.ch>
parents:
8843
diff
changeset
|
368 class linereader(object): |
8810
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
369 # simple class to allow pushing lines back into the input stream |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
370 def __init__(self, fp, textmode=False): |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
371 self.fp = fp |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
372 self.buf = [] |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
373 self.textmode = textmode |
10102
1720d70cd6d4
patch: implement patch.eol=auto mode
Martin Geisler <mg@lazybytes.net>
parents:
10101
diff
changeset
|
374 self.eol = None |
8810
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
375 |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
376 def push(self, line): |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
377 if line is not None: |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
378 self.buf.append(line) |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
379 |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
380 def readline(self): |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
381 if self.buf: |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
382 l = self.buf[0] |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
383 del self.buf[0] |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
384 return l |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
385 l = self.fp.readline() |
10102
1720d70cd6d4
patch: implement patch.eol=auto mode
Martin Geisler <mg@lazybytes.net>
parents:
10101
diff
changeset
|
386 if not self.eol: |
1720d70cd6d4
patch: implement patch.eol=auto mode
Martin Geisler <mg@lazybytes.net>
parents:
10101
diff
changeset
|
387 if l.endswith('\r\n'): |
1720d70cd6d4
patch: implement patch.eol=auto mode
Martin Geisler <mg@lazybytes.net>
parents:
10101
diff
changeset
|
388 self.eol = '\r\n' |
1720d70cd6d4
patch: implement patch.eol=auto mode
Martin Geisler <mg@lazybytes.net>
parents:
10101
diff
changeset
|
389 elif l.endswith('\n'): |
1720d70cd6d4
patch: implement patch.eol=auto mode
Martin Geisler <mg@lazybytes.net>
parents:
10101
diff
changeset
|
390 self.eol = '\n' |
8810
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
391 if self.textmode and l.endswith('\r\n'): |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
392 l = l[:-2] + '\n' |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
393 return l |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
394 |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
395 def __iter__(self): |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
396 while 1: |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
397 l = self.readline() |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
398 if not l: |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
399 break |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
400 yield l |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
401 |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
402 # @@ -start,len +start,len @@ or @@ -start +start @@ if len is 1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
403 unidesc = re.compile('@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@') |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
404 contextdesc = re.compile('(---|\*\*\*) (\d+)(,(\d+))? (---|\*\*\*)') |
10102
1720d70cd6d4
patch: implement patch.eol=auto mode
Martin Geisler <mg@lazybytes.net>
parents:
10101
diff
changeset
|
405 eolmodes = ['strict', 'crlf', 'lf', 'auto'] |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
406 |
8778
c5f36402daad
use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8761
diff
changeset
|
407 class patchfile(object): |
10101
155fe35534d3
patch: propagate eolmode down to patchfile
Martin Geisler <mg@lazybytes.net>
parents:
9725
diff
changeset
|
408 def __init__(self, ui, fname, opener, missing=False, eolmode='strict'): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
409 self.fname = fname |
10101
155fe35534d3
patch: propagate eolmode down to patchfile
Martin Geisler <mg@lazybytes.net>
parents:
9725
diff
changeset
|
410 self.eolmode = eolmode |
10102
1720d70cd6d4
patch: implement patch.eol=auto mode
Martin Geisler <mg@lazybytes.net>
parents:
10101
diff
changeset
|
411 self.eol = None |
7391
27d304c8cc03
patch: pass an opener to patchfile
Patrick Mezard <pmezard@gmail.com>
parents:
7389
diff
changeset
|
412 self.opener = opener |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
413 self.ui = ui |
5652
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
414 self.lines = [] |
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
415 self.exists = False |
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
416 self.missing = missing |
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
417 if not missing: |
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
418 try: |
7392
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
419 self.lines = self.readlines(fname) |
5652
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
420 self.exists = True |
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
421 except IOError: |
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
422 pass |
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
423 else: |
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
424 self.ui.warn(_("unable to find '%s' for patching\n") % self.fname) |
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
425 |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
426 self.hash = {} |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
427 self.dirty = 0 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
428 self.offset = 0 |
10135
9a4034b630c4
patch: better handling of sequence of offset patch hunks (issue1941)
Greg Onufer <gonufer@jazzhaiku.com>
parents:
9725
diff
changeset
|
429 self.skew = 0 |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
430 self.rej = [] |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
431 self.fileprinted = False |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
432 self.printfile(False) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
433 self.hunks = 0 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
434 |
7392
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
435 def readlines(self, fname): |
9585
ea1935e2020a
patch: handle symlinks without symlinkhunk
Patrick Mezard <pmezard@gmail.com>
parents:
9573
diff
changeset
|
436 if os.path.islink(fname): |
ea1935e2020a
patch: handle symlinks without symlinkhunk
Patrick Mezard <pmezard@gmail.com>
parents:
9573
diff
changeset
|
437 return [os.readlink(fname)] |
7392
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
438 fp = self.opener(fname, 'r') |
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
439 try: |
10102
1720d70cd6d4
patch: implement patch.eol=auto mode
Martin Geisler <mg@lazybytes.net>
parents:
10101
diff
changeset
|
440 lr = linereader(fp, self.eolmode != 'strict') |
1720d70cd6d4
patch: implement patch.eol=auto mode
Martin Geisler <mg@lazybytes.net>
parents:
10101
diff
changeset
|
441 lines = list(lr) |
1720d70cd6d4
patch: implement patch.eol=auto mode
Martin Geisler <mg@lazybytes.net>
parents:
10101
diff
changeset
|
442 self.eol = lr.eol |
1720d70cd6d4
patch: implement patch.eol=auto mode
Martin Geisler <mg@lazybytes.net>
parents:
10101
diff
changeset
|
443 return lines |
7392
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
444 finally: |
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
445 fp.close() |
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
446 |
9712
18b134ef294c
kill trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
9684
diff
changeset
|
447 def writelines(self, fname, lines): |
9586
d08099e74b81
patch: handle symlink updates/replacements (issue1785)
Patrick Mezard <pmezard@gmail.com>
parents:
9585
diff
changeset
|
448 # Ensure supplied data ends in fname, being a regular file or |
d08099e74b81
patch: handle symlink updates/replacements (issue1785)
Patrick Mezard <pmezard@gmail.com>
parents:
9585
diff
changeset
|
449 # a symlink. updatedir() will -too magically- take care of |
d08099e74b81
patch: handle symlink updates/replacements (issue1785)
Patrick Mezard <pmezard@gmail.com>
parents:
9585
diff
changeset
|
450 # setting it to the proper type afterwards. |
d08099e74b81
patch: handle symlink updates/replacements (issue1785)
Patrick Mezard <pmezard@gmail.com>
parents:
9585
diff
changeset
|
451 islink = os.path.islink(fname) |
d08099e74b81
patch: handle symlink updates/replacements (issue1785)
Patrick Mezard <pmezard@gmail.com>
parents:
9585
diff
changeset
|
452 if islink: |
d08099e74b81
patch: handle symlink updates/replacements (issue1785)
Patrick Mezard <pmezard@gmail.com>
parents:
9585
diff
changeset
|
453 fp = cStringIO.StringIO() |
d08099e74b81
patch: handle symlink updates/replacements (issue1785)
Patrick Mezard <pmezard@gmail.com>
parents:
9585
diff
changeset
|
454 else: |
d08099e74b81
patch: handle symlink updates/replacements (issue1785)
Patrick Mezard <pmezard@gmail.com>
parents:
9585
diff
changeset
|
455 fp = self.opener(fname, 'w') |
7392
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
456 try: |
10127
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
457 if self.eolmode == 'auto': |
10102
1720d70cd6d4
patch: implement patch.eol=auto mode
Martin Geisler <mg@lazybytes.net>
parents:
10101
diff
changeset
|
458 eol = self.eol |
1720d70cd6d4
patch: implement patch.eol=auto mode
Martin Geisler <mg@lazybytes.net>
parents:
10101
diff
changeset
|
459 elif self.eolmode == 'crlf': |
1720d70cd6d4
patch: implement patch.eol=auto mode
Martin Geisler <mg@lazybytes.net>
parents:
10101
diff
changeset
|
460 eol = '\r\n' |
1720d70cd6d4
patch: implement patch.eol=auto mode
Martin Geisler <mg@lazybytes.net>
parents:
10101
diff
changeset
|
461 else: |
1720d70cd6d4
patch: implement patch.eol=auto mode
Martin Geisler <mg@lazybytes.net>
parents:
10101
diff
changeset
|
462 eol = '\n' |
1720d70cd6d4
patch: implement patch.eol=auto mode
Martin Geisler <mg@lazybytes.net>
parents:
10101
diff
changeset
|
463 |
10127
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
464 if self.eolmode != 'strict' and eol and eol != '\n': |
8810
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
465 for l in lines: |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
466 if l and l[-1] == '\n': |
10102
1720d70cd6d4
patch: implement patch.eol=auto mode
Martin Geisler <mg@lazybytes.net>
parents:
10101
diff
changeset
|
467 l = l[:-1] + eol |
8810
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
468 fp.write(l) |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
469 else: |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
470 fp.writelines(lines) |
9586
d08099e74b81
patch: handle symlink updates/replacements (issue1785)
Patrick Mezard <pmezard@gmail.com>
parents:
9585
diff
changeset
|
471 if islink: |
d08099e74b81
patch: handle symlink updates/replacements (issue1785)
Patrick Mezard <pmezard@gmail.com>
parents:
9585
diff
changeset
|
472 self.opener.symlink(fp.getvalue(), fname) |
7392
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
473 finally: |
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
474 fp.close() |
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
475 |
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
476 def unlink(self, fname): |
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
477 os.unlink(fname) |
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
478 |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
479 def printfile(self, warn): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
480 if self.fileprinted: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
481 return |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
482 if warn or self.ui.verbose: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
483 self.fileprinted = True |
4898
bc905a6c0e76
patch.py: fix some incorrect uses of _() for i18n
Bryan O'Sullivan <bos@serpentine.com>
parents:
4897
diff
changeset
|
484 s = _("patching file %s\n") % self.fname |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
485 if warn: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
486 self.ui.warn(s) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
487 else: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
488 self.ui.note(s) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
489 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
490 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
491 def findlines(self, l, linenum): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
492 # 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
|
493 # 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
|
494 # from linenum |
5143
d4fa6bafc43a
Remove trailing spaces, fix indentation
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5116
diff
changeset
|
495 |
9681
ac3a68cb16eb
patch: simplify logic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9642
diff
changeset
|
496 cand = self.hash.get(l, []) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
497 if len(cand) > 1: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
498 # 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
|
499 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
|
500 return cand |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
501 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
502 def hashlines(self): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
503 self.hash = {} |
8632
9e055cfdd620
replace "i in range(len(xs))" with "i, x in enumerate(xs)"
Martin Geisler <mg@lazybytes.net>
parents:
8527
diff
changeset
|
504 for x, s in enumerate(self.lines): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
505 self.hash.setdefault(s, []).append(x) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
506 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
507 def write_rej(self): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
508 # 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
|
509 # 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
|
510 # 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
|
511 # without having to type the filename. |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
512 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
513 if not self.rej: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
514 return |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
515 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
516 fname = self.fname + ".rej" |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
517 self.ui.warn( |
6952
3fffba1c87d0
i18n: avoid naive plural tricks
Martin Geisler <mg@daimi.au.dk>
parents:
6948
diff
changeset
|
518 _("%d out of %d hunks FAILED -- saving rejects to file %s\n") % |
3fffba1c87d0
i18n: avoid naive plural tricks
Martin Geisler <mg@daimi.au.dk>
parents:
6948
diff
changeset
|
519 (len(self.rej), self.hunks, fname)) |
7392
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
520 |
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
521 def rejlines(): |
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
522 base = os.path.basename(self.fname) |
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
523 yield "--- %s\n+++ %s\n" % (base, base) |
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
524 for x in self.rej: |
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
525 for l in x.hunk: |
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
526 yield l |
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
527 if l[-1] != '\n': |
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
528 yield "\n\ No newline at end of file\n" |
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
529 |
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
530 self.writelines(fname, rejlines()) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
531 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
532 def write(self, dest=None): |
7391
27d304c8cc03
patch: pass an opener to patchfile
Patrick Mezard <pmezard@gmail.com>
parents:
7389
diff
changeset
|
533 if not self.dirty: |
27d304c8cc03
patch: pass an opener to patchfile
Patrick Mezard <pmezard@gmail.com>
parents:
7389
diff
changeset
|
534 return |
27d304c8cc03
patch: pass an opener to patchfile
Patrick Mezard <pmezard@gmail.com>
parents:
7389
diff
changeset
|
535 if not dest: |
27d304c8cc03
patch: pass an opener to patchfile
Patrick Mezard <pmezard@gmail.com>
parents:
7389
diff
changeset
|
536 dest = self.fname |
7392
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
537 self.writelines(dest, self.lines) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
538 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
539 def close(self): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
540 self.write() |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
541 self.write_rej() |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
542 |
9393
23c4e772c172
patch: remove the unused, broken reverse() function
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9392
diff
changeset
|
543 def apply(self, h): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
544 if not h.complete(): |
4898
bc905a6c0e76
patch.py: fix some incorrect uses of _() for i18n
Bryan O'Sullivan <bos@serpentine.com>
parents:
4897
diff
changeset
|
545 raise PatchError(_("bad hunk #%d %s (%d %d %d %d)") % |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
546 (h.number, h.desc, len(h.a), h.lena, len(h.b), |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
547 h.lenb)) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
548 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
549 self.hunks += 1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
550 |
5652
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
551 if self.missing: |
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
552 self.rej.append(h) |
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
553 return -1 |
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
554 |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
555 if self.exists and h.createfile(): |
4898
bc905a6c0e76
patch.py: fix some incorrect uses of _() for i18n
Bryan O'Sullivan <bos@serpentine.com>
parents:
4897
diff
changeset
|
556 self.ui.warn(_("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
|
557 self.rej.append(h) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
558 return -1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
559 |
9585
ea1935e2020a
patch: handle symlinks without symlinkhunk
Patrick Mezard <pmezard@gmail.com>
parents:
9573
diff
changeset
|
560 if isinstance(h, binhunk): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
561 if h.rmfile(): |
7392
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
562 self.unlink(self.fname) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
563 else: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
564 self.lines[:] = h.new() |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
565 self.offset += len(h.new()) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
566 self.dirty = 1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
567 return 0 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
568 |
10127
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
569 horig = h |
10128
ea7c392f2b08
patch: drop eol normalization fast-path for 'lf' and 'crlf'
Patrick Mezard <pmezard@gmail.com>
parents:
10127
diff
changeset
|
570 if (self.eolmode in ('crlf', 'lf') |
ea7c392f2b08
patch: drop eol normalization fast-path for 'lf' and 'crlf'
Patrick Mezard <pmezard@gmail.com>
parents:
10127
diff
changeset
|
571 or self.eolmode == 'auto' and self.eol): |
ea7c392f2b08
patch: drop eol normalization fast-path for 'lf' and 'crlf'
Patrick Mezard <pmezard@gmail.com>
parents:
10127
diff
changeset
|
572 # 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
|
573 # 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
|
574 # line-endings. |
10127
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
575 h = h.getnormalized() |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
576 |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
577 # fast case first, no offsets, no fuzz |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
578 old = h.old() |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
579 # patch starts counting at 1 unless we are adding the file |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
580 if h.starta == 0: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
581 start = 0 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
582 else: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
583 start = h.starta + self.offset - 1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
584 orig_start = start |
10135
9a4034b630c4
patch: better handling of sequence of offset patch hunks (issue1941)
Greg Onufer <gonufer@jazzhaiku.com>
parents:
9725
diff
changeset
|
585 # 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
|
586 # 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
|
587 # fast case code |
9a4034b630c4
patch: better handling of sequence of offset patch hunks (issue1941)
Greg Onufer <gonufer@jazzhaiku.com>
parents:
9725
diff
changeset
|
588 if self.skew == 0 and diffhelpers.testhunk(old, self.lines, start) == 0: |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
589 if h.rmfile(): |
7392
564326a6ef9c
patch: isolate patchfile filesystem calls into methods
Patrick Mezard <pmezard@gmail.com>
parents:
7391
diff
changeset
|
590 self.unlink(self.fname) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
591 else: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
592 self.lines[start : start + h.lena] = h.new() |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
593 self.offset += h.lenb - h.lena |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
594 self.dirty = 1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
595 return 0 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
596 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
597 # ok, we couldn't match the hunk. Lets look for offsets and fuzz it |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
598 self.hashlines() |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
599 if h.hunk[-1][0] != ' ': |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
600 # if the hunk tried to put something at the bottom of the file |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
601 # override the start line and use eof here |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
602 search_start = len(self.lines) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
603 else: |
10135
9a4034b630c4
patch: better handling of sequence of offset patch hunks (issue1941)
Greg Onufer <gonufer@jazzhaiku.com>
parents:
9725
diff
changeset
|
604 search_start = orig_start + self.skew |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
605 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
606 for fuzzlen in xrange(3): |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
607 for toponly in [True, False]: |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
608 old = h.old(fuzzlen, toponly) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
609 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
610 cand = self.findlines(old[0][1:], search_start) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
611 for l in cand: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
612 if diffhelpers.testhunk(old, self.lines, l) == 0: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
613 newlines = h.new(fuzzlen, toponly) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
614 self.lines[l : l + len(old)] = newlines |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
615 self.offset += len(newlines) - len(old) |
10135
9a4034b630c4
patch: better handling of sequence of offset patch hunks (issue1941)
Greg Onufer <gonufer@jazzhaiku.com>
parents:
9725
diff
changeset
|
616 self.skew = l - orig_start |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
617 self.dirty = 1 |
10518
5fe51d348daf
patch, i18n: avoid parameterized messages
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
10501
diff
changeset
|
618 offset = l - orig_start - fuzzlen |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
619 if fuzzlen: |
10518
5fe51d348daf
patch, i18n: avoid parameterized messages
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
10501
diff
changeset
|
620 msg = _("Hunk #%d succeeded at %d " |
5fe51d348daf
patch, i18n: avoid parameterized messages
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
10501
diff
changeset
|
621 "with fuzz %d " |
5fe51d348daf
patch, i18n: avoid parameterized messages
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
10501
diff
changeset
|
622 "(offset %d lines).\n") |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
623 self.printfile(True) |
10518
5fe51d348daf
patch, i18n: avoid parameterized messages
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
10501
diff
changeset
|
624 self.ui.warn(msg % |
5fe51d348daf
patch, i18n: avoid parameterized messages
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
10501
diff
changeset
|
625 (h.number, l + 1, fuzzlen, offset)) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
626 else: |
10518
5fe51d348daf
patch, i18n: avoid parameterized messages
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
10501
diff
changeset
|
627 msg = _("Hunk #%d succeeded at %d " |
8090
388bb482024e
patch, i18n: avoid parameterized plural
Wagner Bruna <wbruna@yahoo.com>
parents:
7972
diff
changeset
|
628 "(offset %d lines).\n") |
10518
5fe51d348daf
patch, i18n: avoid parameterized messages
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
10501
diff
changeset
|
629 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
|
630 return fuzzlen |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
631 self.printfile(True) |
4898
bc905a6c0e76
patch.py: fix some incorrect uses of _() for i18n
Bryan O'Sullivan <bos@serpentine.com>
parents:
4897
diff
changeset
|
632 self.ui.warn(_("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
|
633 self.rej.append(horig) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
634 return -1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
635 |
8778
c5f36402daad
use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8761
diff
changeset
|
636 class hunk(object): |
6280
9db24a36d182
patch: check filename is /dev/null for creation or deletion (issue 1033)
Patrick Mezard <pmezard@gmail.com>
parents:
6275
diff
changeset
|
637 def __init__(self, desc, num, lr, context, create=False, remove=False): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
638 self.number = num |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
639 self.desc = desc |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
640 self.hunk = [desc] |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
641 self.a = [] |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
642 self.b = [] |
9682
bd70f645cfb0
patch: initialize all attributes of the hunk class
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9681
diff
changeset
|
643 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
|
644 self.startb = self.lenb = None |
10127
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
645 if lr is not None: |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
646 if context: |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
647 self.read_context_hunk(lr) |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
648 else: |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
649 self.read_unified_hunk(lr) |
6280
9db24a36d182
patch: check filename is /dev/null for creation or deletion (issue 1033)
Patrick Mezard <pmezard@gmail.com>
parents:
6275
diff
changeset
|
650 self.create = create |
9db24a36d182
patch: check filename is /dev/null for creation or deletion (issue 1033)
Patrick Mezard <pmezard@gmail.com>
parents:
6275
diff
changeset
|
651 self.remove = remove and not create |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
652 |
10127
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
653 def getnormalized(self): |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
654 """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
|
655 |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
656 def normalize(lines): |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
657 nlines = [] |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
658 for line in lines: |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
659 if line.endswith('\r\n'): |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
660 line = line[:-2] + '\n' |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
661 nlines.append(line) |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
662 return nlines |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
663 |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
664 # Dummy object, it is rebuilt manually |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
665 nh = hunk(self.desc, self.number, None, None, False, False) |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
666 nh.number = self.number |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
667 nh.desc = self.desc |
10524
3212afb33116
patch: fix patching with fuzz and eol normalization
Patrick Mezard <pmezard@gmail.com>
parents:
10518
diff
changeset
|
668 nh.hunk = self.hunk |
10127
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
669 nh.a = normalize(self.a) |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
670 nh.b = normalize(self.b) |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
671 nh.starta = self.starta |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
672 nh.startb = self.startb |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
673 nh.lena = self.lena |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
674 nh.lenb = self.lenb |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
675 nh.create = self.create |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
676 nh.remove = self.remove |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
677 return nh |
d8214e944b84
patch: fix eolmode=auto with new files
Patrick Mezard <pmezard@gmail.com>
parents:
10102
diff
changeset
|
678 |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
679 def read_unified_hunk(self, lr): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
680 m = unidesc.match(self.desc) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
681 if not m: |
4898
bc905a6c0e76
patch.py: fix some incorrect uses of _() for i18n
Bryan O'Sullivan <bos@serpentine.com>
parents:
4897
diff
changeset
|
682 raise PatchError(_("bad hunk #%d") % self.number) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
683 self.starta, foo, self.lena, self.startb, foo2, self.lenb = m.groups() |
8527
f9a80054dd3c
use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents:
8526
diff
changeset
|
684 if self.lena is None: |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
685 self.lena = 1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
686 else: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
687 self.lena = int(self.lena) |
8527
f9a80054dd3c
use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents:
8526
diff
changeset
|
688 if self.lenb is None: |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
689 self.lenb = 1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
690 else: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
691 self.lenb = int(self.lenb) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
692 self.starta = int(self.starta) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
693 self.startb = int(self.startb) |
7152
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
694 diffhelpers.addlines(lr, self.hunk, self.lena, self.lenb, self.a, self.b) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
695 # 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
|
696 # 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
|
697 while len(self.hunk[-1]) == 0: |
6948
359e93ceee3a
fix double indentation and trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
698 del self.hunk[-1] |
359e93ceee3a
fix double indentation and trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
699 del self.a[-1] |
359e93ceee3a
fix double indentation and trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
700 del self.b[-1] |
359e93ceee3a
fix double indentation and trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
701 self.lena -= 1 |
359e93ceee3a
fix double indentation and trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
702 self.lenb -= 1 |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
703 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
704 def read_context_hunk(self, lr): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
705 self.desc = lr.readline() |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
706 m = contextdesc.match(self.desc) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
707 if not m: |
4898
bc905a6c0e76
patch.py: fix some incorrect uses of _() for i18n
Bryan O'Sullivan <bos@serpentine.com>
parents:
4897
diff
changeset
|
708 raise PatchError(_("bad hunk #%d") % self.number) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
709 foo, self.starta, foo2, aend, foo3 = m.groups() |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
710 self.starta = int(self.starta) |
8527
f9a80054dd3c
use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents:
8526
diff
changeset
|
711 if aend is None: |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
712 aend = self.starta |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
713 self.lena = int(aend) - self.starta |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
714 if self.starta: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
715 self.lena += 1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
716 for x in xrange(self.lena): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
717 l = lr.readline() |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
718 if l.startswith('---'): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
719 lr.push(l) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
720 break |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
721 s = l[2:] |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
722 if l.startswith('- ') or l.startswith('! '): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
723 u = '-' + s |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
724 elif l.startswith(' '): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
725 u = ' ' + s |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
726 else: |
4898
bc905a6c0e76
patch.py: fix some incorrect uses of _() for i18n
Bryan O'Sullivan <bos@serpentine.com>
parents:
4897
diff
changeset
|
727 raise PatchError(_("bad hunk #%d old text line %d") % |
bc905a6c0e76
patch.py: fix some incorrect uses of _() for i18n
Bryan O'Sullivan <bos@serpentine.com>
parents:
4897
diff
changeset
|
728 (self.number, x)) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
729 self.a.append(u) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
730 self.hunk.append(u) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
731 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
732 l = lr.readline() |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
733 if l.startswith('\ '): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
734 s = self.a[-1][:-1] |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
735 self.a[-1] = s |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
736 self.hunk[-1] = s |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
737 l = lr.readline() |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
738 m = contextdesc.match(l) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
739 if not m: |
4898
bc905a6c0e76
patch.py: fix some incorrect uses of _() for i18n
Bryan O'Sullivan <bos@serpentine.com>
parents:
4897
diff
changeset
|
740 raise PatchError(_("bad hunk #%d") % self.number) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
741 foo, self.startb, foo2, bend, foo3 = m.groups() |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
742 self.startb = int(self.startb) |
8527
f9a80054dd3c
use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents:
8526
diff
changeset
|
743 if bend is None: |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
744 bend = self.startb |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
745 self.lenb = int(bend) - self.startb |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
746 if self.startb: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
747 self.lenb += 1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
748 hunki = 1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
749 for x in xrange(self.lenb): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
750 l = lr.readline() |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
751 if l.startswith('\ '): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
752 s = self.b[-1][:-1] |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
753 self.b[-1] = s |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
754 self.hunk[hunki - 1] = s |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
755 continue |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
756 if not l: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
757 lr.push(l) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
758 break |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
759 s = l[2:] |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
760 if l.startswith('+ ') or l.startswith('! '): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
761 u = '+' + s |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
762 elif l.startswith(' '): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
763 u = ' ' + s |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
764 elif len(self.b) == 0: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
765 # this can happen when the hunk does not add any lines |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
766 lr.push(l) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
767 break |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
768 else: |
4898
bc905a6c0e76
patch.py: fix some incorrect uses of _() for i18n
Bryan O'Sullivan <bos@serpentine.com>
parents:
4897
diff
changeset
|
769 raise PatchError(_("bad hunk #%d old text line %d") % |
bc905a6c0e76
patch.py: fix some incorrect uses of _() for i18n
Bryan O'Sullivan <bos@serpentine.com>
parents:
4897
diff
changeset
|
770 (self.number, x)) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
771 self.b.append(s) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
772 while True: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
773 if hunki >= len(self.hunk): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
774 h = "" |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
775 else: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
776 h = self.hunk[hunki] |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
777 hunki += 1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
778 if h == u: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
779 break |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
780 elif h.startswith('-'): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
781 continue |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
782 else: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
783 self.hunk.insert(hunki - 1, u) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
784 break |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
785 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
786 if not self.a: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
787 # 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
|
788 for x in self.hunk: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
789 if x.startswith('-') or x.startswith(' '): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
790 self.a.append(x) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
791 if not self.b: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
792 # 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
|
793 for x in self.hunk: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
794 if x.startswith('+') or x.startswith(' '): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
795 self.b.append(x[1:]) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
796 # @@ -start,len +start,len @@ |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
797 self.desc = "@@ -%d,%d +%d,%d @@\n" % (self.starta, self.lena, |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
798 self.startb, self.lenb) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
799 self.hunk[0] = self.desc |
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 def fix_newline(self): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
802 diffhelpers.fix_newline(self.hunk, self.a, self.b) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
803 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
804 def complete(self): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
805 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
|
806 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
807 def createfile(self): |
6280
9db24a36d182
patch: check filename is /dev/null for creation or deletion (issue 1033)
Patrick Mezard <pmezard@gmail.com>
parents:
6275
diff
changeset
|
808 return self.starta == 0 and self.lena == 0 and self.create |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
809 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
810 def rmfile(self): |
6280
9db24a36d182
patch: check filename is /dev/null for creation or deletion (issue 1033)
Patrick Mezard <pmezard@gmail.com>
parents:
6275
diff
changeset
|
811 return self.startb == 0 and self.lenb == 0 and self.remove |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
812 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
813 def fuzzit(self, l, fuzz, toponly): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
814 # 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
|
815 # 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
|
816 # returns a new shortened list of lines. |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
817 fuzz = min(fuzz, len(l)-1) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
818 if fuzz: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
819 top = 0 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
820 bot = 0 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
821 hlen = len(self.hunk) |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
822 for x in xrange(hlen - 1): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
823 # the hunk starts with the @@ line, so use x+1 |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
824 if self.hunk[x + 1][0] == ' ': |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
825 top += 1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
826 else: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
827 break |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
828 if not toponly: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
829 for x in xrange(hlen - 1): |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
830 if self.hunk[hlen - bot - 1][0] == ' ': |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
831 bot += 1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
832 else: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
833 break |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
834 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
835 # top and bot now count context in the hunk |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
836 # adjust them if either one is short |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
837 context = max(top, bot, 3) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
838 if bot < context: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
839 bot = max(0, fuzz - (context - bot)) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
840 else: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
841 bot = min(fuzz, bot) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
842 if top < context: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
843 top = max(0, fuzz - (context - top)) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
844 else: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
845 top = min(fuzz, top) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
846 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
847 return l[top:len(l)-bot] |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
848 return l |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
849 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
850 def old(self, fuzz=0, toponly=False): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
851 return self.fuzzit(self.a, fuzz, toponly) |
5143
d4fa6bafc43a
Remove trailing spaces, fix indentation
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5116
diff
changeset
|
852 |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
853 def new(self, fuzz=0, toponly=False): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
854 return self.fuzzit(self.b, fuzz, toponly) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
855 |
9585
ea1935e2020a
patch: handle symlinks without symlinkhunk
Patrick Mezard <pmezard@gmail.com>
parents:
9573
diff
changeset
|
856 class binhunk: |
ea1935e2020a
patch: handle symlinks without symlinkhunk
Patrick Mezard <pmezard@gmail.com>
parents:
9573
diff
changeset
|
857 'A binary patch file. Only understands literals so far.' |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
858 def __init__(self, gitpatch): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
859 self.gitpatch = gitpatch |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
860 self.text = None |
9585
ea1935e2020a
patch: handle symlinks without symlinkhunk
Patrick Mezard <pmezard@gmail.com>
parents:
9573
diff
changeset
|
861 self.hunk = ['GIT binary patch\n'] |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
862 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
863 def createfile(self): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
864 return self.gitpatch.op in ('ADD', 'RENAME', 'COPY') |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
865 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
866 def rmfile(self): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
867 return self.gitpatch.op == 'DELETE' |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
868 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
869 def complete(self): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
870 return self.text is not None |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
871 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
872 def new(self): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
873 return [self.text] |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
874 |
7153
353141d74ca8
patch: pass linereader to binaryhunk.extract() instead of wrapped fp
Patrick Mezard <pmezard@gmail.com>
parents:
7152
diff
changeset
|
875 def extract(self, lr): |
353141d74ca8
patch: pass linereader to binaryhunk.extract() instead of wrapped fp
Patrick Mezard <pmezard@gmail.com>
parents:
7152
diff
changeset
|
876 line = lr.readline() |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
877 self.hunk.append(line) |
3367
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
878 while line and not line.startswith('literal '): |
7153
353141d74ca8
patch: pass linereader to binaryhunk.extract() instead of wrapped fp
Patrick Mezard <pmezard@gmail.com>
parents:
7152
diff
changeset
|
879 line = lr.readline() |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
880 self.hunk.append(line) |
3367
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
881 if not line: |
4898
bc905a6c0e76
patch.py: fix some incorrect uses of _() for i18n
Bryan O'Sullivan <bos@serpentine.com>
parents:
4897
diff
changeset
|
882 raise PatchError(_('could not extract binary patch')) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
883 size = int(line[8:].rstrip()) |
3367
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
884 dec = [] |
7153
353141d74ca8
patch: pass linereader to binaryhunk.extract() instead of wrapped fp
Patrick Mezard <pmezard@gmail.com>
parents:
7152
diff
changeset
|
885 line = lr.readline() |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
886 self.hunk.append(line) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
887 while len(line) > 1: |
3374
fd43ff3b4442
Use line length field when extracting git binary patches
Brendan Cully <brendan@kublai.com>
parents:
3367
diff
changeset
|
888 l = line[0] |
fd43ff3b4442
Use line length field when extracting git binary patches
Brendan Cully <brendan@kublai.com>
parents:
3367
diff
changeset
|
889 if l <= 'Z' and l >= 'A': |
fd43ff3b4442
Use line length field when extracting git binary patches
Brendan Cully <brendan@kublai.com>
parents:
3367
diff
changeset
|
890 l = ord(l) - ord('A') + 1 |
fd43ff3b4442
Use line length field when extracting git binary patches
Brendan Cully <brendan@kublai.com>
parents:
3367
diff
changeset
|
891 else: |
fd43ff3b4442
Use line length field when extracting git binary patches
Brendan Cully <brendan@kublai.com>
parents:
3367
diff
changeset
|
892 l = ord(l) - ord('a') + 27 |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
893 dec.append(base85.b85decode(line[1:-1])[:l]) |
7153
353141d74ca8
patch: pass linereader to binaryhunk.extract() instead of wrapped fp
Patrick Mezard <pmezard@gmail.com>
parents:
7152
diff
changeset
|
894 line = lr.readline() |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
895 self.hunk.append(line) |
3367
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
896 text = zlib.decompress(''.join(dec)) |
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
897 if len(text) != size: |
4898
bc905a6c0e76
patch.py: fix some incorrect uses of _() for i18n
Bryan O'Sullivan <bos@serpentine.com>
parents:
4897
diff
changeset
|
898 raise PatchError(_('binary patch is %d bytes, not %d') % |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
899 len(text), size) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
900 self.text = text |
3367
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
901 |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
902 def parsefilename(str): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
903 # --- filename \t|space stuff |
5851
03f550f9b554
patch: remove CRLF when parsing file names
Patrick Mezard <pmezard@gmail.com>
parents:
5669
diff
changeset
|
904 s = str[4:].rstrip('\r\n') |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
905 i = s.find('\t') |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
906 if i < 0: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
907 i = s.find(' ') |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
908 if i < 0: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
909 return s |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
910 return s[:i] |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
911 |
9393
23c4e772c172
patch: remove the unused, broken reverse() function
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9392
diff
changeset
|
912 def selectfile(afile_orig, bfile_orig, hunk, strip): |
11019
4fe28bdc27be
patch: make "unable to strip away" message less confusing
Mads Kiilerich <mads@kiilerich.com>
parents:
11018
diff
changeset
|
913 def pathstrip(path, strip): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
914 pathlen = len(path) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
915 i = 0 |
11019
4fe28bdc27be
patch: make "unable to strip away" message less confusing
Mads Kiilerich <mads@kiilerich.com>
parents:
11018
diff
changeset
|
916 if strip == 0: |
6520
ba0b2dacc623
fix import with -p0
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6467
diff
changeset
|
917 return '', path.rstrip() |
11019
4fe28bdc27be
patch: make "unable to strip away" message less confusing
Mads Kiilerich <mads@kiilerich.com>
parents:
11018
diff
changeset
|
918 count = strip |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
919 while count > 0: |
4922
020ee9c781cf
patch: fix normalized paths separators.
Patrick Mezard <pmezard@gmail.com>
parents:
4900
diff
changeset
|
920 i = path.find('/', i) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
921 if i == -1: |
11019
4fe28bdc27be
patch: make "unable to strip away" message less confusing
Mads Kiilerich <mads@kiilerich.com>
parents:
11018
diff
changeset
|
922 raise PatchError(_("unable to strip away %d of %d dirs from %s") % |
4fe28bdc27be
patch: make "unable to strip away" message less confusing
Mads Kiilerich <mads@kiilerich.com>
parents:
11018
diff
changeset
|
923 (count, strip, path)) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
924 i += 1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
925 # consume '//' in the path |
4922
020ee9c781cf
patch: fix normalized paths separators.
Patrick Mezard <pmezard@gmail.com>
parents:
4900
diff
changeset
|
926 while i < pathlen - 1 and path[i] == '/': |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
927 i += 1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
928 count -= 1 |
6295
bace1990ab12
patch: fix corner case with update + copy patch handling (issue 937)
Patrick Mezard <pmezard@gmail.com>
parents:
6280
diff
changeset
|
929 return path[:i].lstrip(), path[i:].rstrip() |
3367
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
930 |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
931 nulla = afile_orig == "/dev/null" |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
932 nullb = bfile_orig == "/dev/null" |
6295
bace1990ab12
patch: fix corner case with update + copy patch handling (issue 937)
Patrick Mezard <pmezard@gmail.com>
parents:
6280
diff
changeset
|
933 abase, afile = pathstrip(afile_orig, strip) |
7783
2c5b2abfb8be
patch: teach selectfile about symlinks (issue1438)
Matt Mackall <mpm@selenic.com>
parents:
7753
diff
changeset
|
934 gooda = not nulla and util.lexists(afile) |
6295
bace1990ab12
patch: fix corner case with update + copy patch handling (issue 937)
Patrick Mezard <pmezard@gmail.com>
parents:
6280
diff
changeset
|
935 bbase, bfile = pathstrip(bfile_orig, strip) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
936 if afile == bfile: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
937 goodb = gooda |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
938 else: |
5651
e11940d84606
patch: avoid file existence tests when possible in selectfile()
Patrick Mezard <pmezard@gmail.com>
parents:
5650
diff
changeset
|
939 goodb = not nullb and os.path.exists(bfile) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
940 createfunc = hunk.createfile |
5652
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
941 missing = not goodb and not gooda and not createfunc() |
9328
648d6a1a1cf2
patch: create file even if source is not /dev/null
Brendan Cully <brendan@kublai.com>
parents:
9248
diff
changeset
|
942 |
648d6a1a1cf2
patch: create file even if source is not /dev/null
Brendan Cully <brendan@kublai.com>
parents:
9248
diff
changeset
|
943 # some diff programs apparently produce create patches where the |
10745
d94832c4a31d
patch: try harder to find the file to patch on file creation (issue2041)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10736
diff
changeset
|
944 # afile is not /dev/null, but afile starts with bfile |
d94832c4a31d
patch: try harder to find the file to patch on file creation (issue2041)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10736
diff
changeset
|
945 abasedir = afile[:afile.rfind('/') + 1] |
d94832c4a31d
patch: try harder to find the file to patch on file creation (issue2041)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10736
diff
changeset
|
946 bbasedir = bfile[:bfile.rfind('/') + 1] |
d94832c4a31d
patch: try harder to find the file to patch on file creation (issue2041)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10736
diff
changeset
|
947 if missing and abasedir == bbasedir and afile.startswith(bfile): |
9328
648d6a1a1cf2
patch: create file even if source is not /dev/null
Brendan Cully <brendan@kublai.com>
parents:
9248
diff
changeset
|
948 # this isn't very pretty |
648d6a1a1cf2
patch: create file even if source is not /dev/null
Brendan Cully <brendan@kublai.com>
parents:
9248
diff
changeset
|
949 hunk.create = True |
648d6a1a1cf2
patch: create file even if source is not /dev/null
Brendan Cully <brendan@kublai.com>
parents:
9248
diff
changeset
|
950 if createfunc(): |
648d6a1a1cf2
patch: create file even if source is not /dev/null
Brendan Cully <brendan@kublai.com>
parents:
9248
diff
changeset
|
951 missing = False |
648d6a1a1cf2
patch: create file even if source is not /dev/null
Brendan Cully <brendan@kublai.com>
parents:
9248
diff
changeset
|
952 else: |
648d6a1a1cf2
patch: create file even if source is not /dev/null
Brendan Cully <brendan@kublai.com>
parents:
9248
diff
changeset
|
953 hunk.create = False |
648d6a1a1cf2
patch: create file even if source is not /dev/null
Brendan Cully <brendan@kublai.com>
parents:
9248
diff
changeset
|
954 |
6295
bace1990ab12
patch: fix corner case with update + copy patch handling (issue 937)
Patrick Mezard <pmezard@gmail.com>
parents:
6280
diff
changeset
|
955 # 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
|
956 # 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
|
957 # file should be patched (see original mpatch code). |
bace1990ab12
patch: fix corner case with update + copy patch handling (issue 937)
Patrick Mezard <pmezard@gmail.com>
parents:
6280
diff
changeset
|
958 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
|
959 fname = None |
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
960 if not missing: |
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
961 if gooda and goodb: |
6295
bace1990ab12
patch: fix corner case with update + copy patch handling (issue 937)
Patrick Mezard <pmezard@gmail.com>
parents:
6280
diff
changeset
|
962 fname = isbackup and afile or bfile |
5652
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
963 elif gooda: |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
964 fname = afile |
5760
0145f9afb0e7
Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5706
diff
changeset
|
965 |
5652
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
966 if not fname: |
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
967 if not nullb: |
6295
bace1990ab12
patch: fix corner case with update + copy patch handling (issue 937)
Patrick Mezard <pmezard@gmail.com>
parents:
6280
diff
changeset
|
968 fname = isbackup and afile or bfile |
5652
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
969 elif not nulla: |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
970 fname = afile |
5652
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
971 else: |
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
972 raise PatchError(_("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
|
973 |
5652
e90e72c6b4c7
patch: write rej files for missing targets (issue 853)
Patrick Mezard <pmezard@gmail.com>
parents:
5651
diff
changeset
|
974 return fname, missing |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
975 |
7152
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
976 def scangitpatch(lr, firstline): |
7186
f77c8d8331ca
clean up trailing spaces, leading spaces in C
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7153
diff
changeset
|
977 """ |
7152
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
978 Git patches can emit: |
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
979 - rename a to b |
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
980 - change b |
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
981 - copy a to c |
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
982 - change c |
7186
f77c8d8331ca
clean up trailing spaces, leading spaces in C
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7153
diff
changeset
|
983 |
7152
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
984 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
|
985 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
|
986 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
|
987 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
|
988 perform the copies ahead of time. |
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
989 """ |
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
990 pos = 0 |
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
991 try: |
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
992 pos = lr.fp.tell() |
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
993 fp = lr.fp |
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
994 except IOError: |
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
995 fp = cStringIO.StringIO(lr.fp.read()) |
8810
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
996 gitlr = linereader(fp, lr.textmode) |
7152
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
997 gitlr.push(firstline) |
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
998 (dopatch, gitpatches) = readgitpatch(gitlr) |
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
999 fp.seek(pos) |
7153
353141d74ca8
patch: pass linereader to binaryhunk.extract() instead of wrapped fp
Patrick Mezard <pmezard@gmail.com>
parents:
7152
diff
changeset
|
1000 return dopatch, gitpatches |
7152
f0055cec8446
patch: pass linereader to scangitpatch(), extract from iterhunks()
Patrick Mezard <pmezard@gmail.com>
parents:
7151
diff
changeset
|
1001 |
10128
ea7c392f2b08
patch: drop eol normalization fast-path for 'lf' and 'crlf'
Patrick Mezard <pmezard@gmail.com>
parents:
10127
diff
changeset
|
1002 def iterhunks(ui, fp, sourcefile=None): |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1003 """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
|
1004 - ("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
|
1005 - ("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
|
1006 "file" event. |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1007 - ("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
|
1008 maps filenames to gitpatch records. Unique event. |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1009 """ |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1010 changed = {} |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1011 current_hunk = None |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1012 afile = "" |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1013 bfile = "" |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1014 state = None |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1015 hunknum = 0 |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1016 emitfile = False |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1017 git = False |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
1018 |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1019 # our states |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1020 BFILE = 1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1021 context = None |
10128
ea7c392f2b08
patch: drop eol normalization fast-path for 'lf' and 'crlf'
Patrick Mezard <pmezard@gmail.com>
parents:
10127
diff
changeset
|
1022 lr = linereader(fp) |
6179
36ab165abbe2
patch: fix iterhunks() with trailing binary file removal
Patrick Mezard <pmezard@gmail.com>
parents:
6042
diff
changeset
|
1023 # gitworkdone is True if a git operation (copy, rename, ...) was |
36ab165abbe2
patch: fix iterhunks() with trailing binary file removal
Patrick Mezard <pmezard@gmail.com>
parents:
6042
diff
changeset
|
1024 # performed already for the current file. Useful when the file |
36ab165abbe2
patch: fix iterhunks() with trailing binary file removal
Patrick Mezard <pmezard@gmail.com>
parents:
6042
diff
changeset
|
1025 # section may have no hunk. |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1026 gitworkdone = False |
10748
fb06e357e698
patch: more precise NoHunk, raised for every file (issue2102)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10747
diff
changeset
|
1027 empty = None |
2861
0f08f2c042ec
Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff
changeset
|
1028 |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1029 while True: |
10747
b010d899665e
patch: differentiate start of file with diff --git vs '--- '
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10745
diff
changeset
|
1030 newfile = newgitfile = False |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1031 x = lr.readline() |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1032 if not x: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1033 break |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1034 if current_hunk: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1035 if x.startswith('\ '): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1036 current_hunk.fix_newline() |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1037 yield 'hunk', current_hunk |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1038 current_hunk = None |
10748
fb06e357e698
patch: more precise NoHunk, raised for every file (issue2102)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10747
diff
changeset
|
1039 empty = False |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1040 if ((sourcefile or state == BFILE) and ((not context and x[0] == '@') or |
8526
f78eadbb5769
patch: simplify Boolean expression slightly
Martin Geisler <mg@lazybytes.net>
parents:
8461
diff
changeset
|
1041 ((context is not False) and x.startswith('***************')))): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1042 try: |
8527
f9a80054dd3c
use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents:
8526
diff
changeset
|
1043 if context is None and x.startswith('***************'): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1044 context = True |
7199
dd891d0d97a3
patch: consolidate two different regexes for parsing of git diffs
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7198
diff
changeset
|
1045 gpatch = changed.get(bfile) |
6280
9db24a36d182
patch: check filename is /dev/null for creation or deletion (issue 1033)
Patrick Mezard <pmezard@gmail.com>
parents:
6275
diff
changeset
|
1046 create = afile == '/dev/null' or gpatch and gpatch.op == 'ADD' |
9db24a36d182
patch: check filename is /dev/null for creation or deletion (issue 1033)
Patrick Mezard <pmezard@gmail.com>
parents:
6275
diff
changeset
|
1047 remove = bfile == '/dev/null' or gpatch and gpatch.op == 'DELETE' |
9db24a36d182
patch: check filename is /dev/null for creation or deletion (issue 1033)
Patrick Mezard <pmezard@gmail.com>
parents:
6275
diff
changeset
|
1048 current_hunk = hunk(x, hunknum + 1, lr, context, create, remove) |
4898
bc905a6c0e76
patch.py: fix some incorrect uses of _() for i18n
Bryan O'Sullivan <bos@serpentine.com>
parents:
4897
diff
changeset
|
1049 except PatchError, err: |
bc905a6c0e76
patch.py: fix some incorrect uses of _() for i18n
Bryan O'Sullivan <bos@serpentine.com>
parents:
4897
diff
changeset
|
1050 ui.debug(err) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1051 current_hunk = None |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1052 continue |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1053 hunknum += 1 |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1054 if emitfile: |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1055 emitfile = False |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1056 yield 'file', (afile, bfile, current_hunk) |
10748
fb06e357e698
patch: more precise NoHunk, raised for every file (issue2102)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10747
diff
changeset
|
1057 empty = False |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1058 elif state == BFILE and x.startswith('GIT binary patch'): |
7199
dd891d0d97a3
patch: consolidate two different regexes for parsing of git diffs
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7198
diff
changeset
|
1059 current_hunk = binhunk(changed[bfile]) |
5581
8a8c341bd292
mq: missing target files do not make qpush to fail immediately (issue 835)
Patrick Mezard <pmezard@gmail.com>
parents:
5547
diff
changeset
|
1060 hunknum += 1 |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1061 if emitfile: |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1062 emitfile = False |
7199
dd891d0d97a3
patch: consolidate two different regexes for parsing of git diffs
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7198
diff
changeset
|
1063 yield 'file', ('a/' + afile, 'b/' + bfile, current_hunk) |
10748
fb06e357e698
patch: more precise NoHunk, raised for every file (issue2102)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10747
diff
changeset
|
1064 empty = False |
7153
353141d74ca8
patch: pass linereader to binaryhunk.extract() instead of wrapped fp
Patrick Mezard <pmezard@gmail.com>
parents:
7152
diff
changeset
|
1065 current_hunk.extract(lr) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1066 elif x.startswith('diff --git'): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1067 # check for git diff, scanning the whole patch file if needed |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1068 m = gitre.match(x) |
10748
fb06e357e698
patch: more precise NoHunk, raised for every file (issue2102)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10747
diff
changeset
|
1069 gitworkdone = False |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1070 if m: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1071 afile, bfile = m.group(1, 2) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1072 if not git: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1073 git = True |
10748
fb06e357e698
patch: more precise NoHunk, raised for every file (issue2102)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10747
diff
changeset
|
1074 gitpatches = scangitpatch(lr, x)[1] |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1075 yield 'git', gitpatches |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1076 for gp in gitpatches: |
7150
6d1d61bb2984
patch: map changed files to patchmeta directly
Patrick Mezard <pmezard@gmail.com>
parents:
7149
diff
changeset
|
1077 changed[gp.path] = gp |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1078 # else error? |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1079 # copy/rename + modify should modify target, not source |
7199
dd891d0d97a3
patch: consolidate two different regexes for parsing of git diffs
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7198
diff
changeset
|
1080 gp = changed.get(bfile) |
10748
fb06e357e698
patch: more precise NoHunk, raised for every file (issue2102)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10747
diff
changeset
|
1081 if gp and (gp.op in ('COPY', 'DELETE', 'RENAME', 'ADD') |
fb06e357e698
patch: more precise NoHunk, raised for every file (issue2102)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10747
diff
changeset
|
1082 or gp.mode): |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1083 afile = bfile |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1084 gitworkdone = True |
10747
b010d899665e
patch: differentiate start of file with diff --git vs '--- '
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10745
diff
changeset
|
1085 newgitfile = True |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1086 elif x.startswith('---'): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1087 # check for a unified diff |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1088 l2 = lr.readline() |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1089 if not l2.startswith('+++'): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1090 lr.push(l2) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1091 continue |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1092 newfile = True |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1093 context = False |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1094 afile = parsefilename(x) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1095 bfile = parsefilename(l2) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1096 elif x.startswith('***'): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1097 # check for a context diff |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1098 l2 = lr.readline() |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1099 if not l2.startswith('---'): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1100 lr.push(l2) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1101 continue |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1102 l3 = lr.readline() |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1103 lr.push(l3) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1104 if not l3.startswith("***************"): |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1105 lr.push(l2) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1106 continue |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1107 newfile = True |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1108 context = True |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1109 afile = parsefilename(x) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1110 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
|
1111 |
10748
fb06e357e698
patch: more precise NoHunk, raised for every file (issue2102)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10747
diff
changeset
|
1112 if newfile: |
fb06e357e698
patch: more precise NoHunk, raised for every file (issue2102)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10747
diff
changeset
|
1113 if empty: |
fb06e357e698
patch: more precise NoHunk, raised for every file (issue2102)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10747
diff
changeset
|
1114 raise NoHunks |
fb06e357e698
patch: more precise NoHunk, raised for every file (issue2102)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10747
diff
changeset
|
1115 empty = not gitworkdone |
fb06e357e698
patch: more precise NoHunk, raised for every file (issue2102)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10747
diff
changeset
|
1116 gitworkdone = False |
fb06e357e698
patch: more precise NoHunk, raised for every file (issue2102)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10747
diff
changeset
|
1117 |
10747
b010d899665e
patch: differentiate start of file with diff --git vs '--- '
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10745
diff
changeset
|
1118 if newgitfile or newfile: |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1119 emitfile = True |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1120 state = BFILE |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1121 hunknum = 0 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1122 if current_hunk: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1123 if current_hunk.complete(): |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1124 yield 'hunk', current_hunk |
10748
fb06e357e698
patch: more precise NoHunk, raised for every file (issue2102)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10747
diff
changeset
|
1125 empty = False |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1126 else: |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1127 raise PatchError(_("malformed patch %s %s") % (afile, |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1128 current_hunk.desc)) |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1129 |
10748
fb06e357e698
patch: more precise NoHunk, raised for every file (issue2102)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10747
diff
changeset
|
1130 if (empty is None and not gitworkdone) or empty: |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1131 raise NoHunks |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1132 |
10966
91c58cf54eee
patch: refactor applydiff to allow for mempatching
Augie Fackler <durin42@gmail.com>
parents:
10965
diff
changeset
|
1133 |
10101
155fe35534d3
patch: propagate eolmode down to patchfile
Martin Geisler <mg@lazybytes.net>
parents:
9725
diff
changeset
|
1134 def applydiff(ui, fp, changed, strip=1, sourcefile=None, eolmode='strict'): |
10966
91c58cf54eee
patch: refactor applydiff to allow for mempatching
Augie Fackler <durin42@gmail.com>
parents:
10965
diff
changeset
|
1135 """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
|
1136 |
8810
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
1137 The dict 'changed' is filled in with all of the filenames changed |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
1138 by the patch. Returns 0 for a clean patch, -1 if any rejects were |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
1139 found and 1 if there was any fuzz. |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
1140 |
10101
155fe35534d3
patch: propagate eolmode down to patchfile
Martin Geisler <mg@lazybytes.net>
parents:
9725
diff
changeset
|
1141 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
|
1142 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
|
1143 patching then normalized according to 'eolmode'. |
10966
91c58cf54eee
patch: refactor applydiff to allow for mempatching
Augie Fackler <durin42@gmail.com>
parents:
10965
diff
changeset
|
1144 |
91c58cf54eee
patch: refactor applydiff to allow for mempatching
Augie Fackler <durin42@gmail.com>
parents:
10965
diff
changeset
|
1145 Callers probably want to call 'updatedir' after this to apply |
91c58cf54eee
patch: refactor applydiff to allow for mempatching
Augie Fackler <durin42@gmail.com>
parents:
10965
diff
changeset
|
1146 certain categories of changes not done by this function. |
8810
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
1147 """ |
10966
91c58cf54eee
patch: refactor applydiff to allow for mempatching
Augie Fackler <durin42@gmail.com>
parents:
10965
diff
changeset
|
1148 return _applydiff( |
91c58cf54eee
patch: refactor applydiff to allow for mempatching
Augie Fackler <durin42@gmail.com>
parents:
10965
diff
changeset
|
1149 ui, fp, patchfile, copyfile, |
91c58cf54eee
patch: refactor applydiff to allow for mempatching
Augie Fackler <durin42@gmail.com>
parents:
10965
diff
changeset
|
1150 changed, strip=strip, sourcefile=sourcefile, eolmode=eolmode) |
91c58cf54eee
patch: refactor applydiff to allow for mempatching
Augie Fackler <durin42@gmail.com>
parents:
10965
diff
changeset
|
1151 |
91c58cf54eee
patch: refactor applydiff to allow for mempatching
Augie Fackler <durin42@gmail.com>
parents:
10965
diff
changeset
|
1152 |
91c58cf54eee
patch: refactor applydiff to allow for mempatching
Augie Fackler <durin42@gmail.com>
parents:
10965
diff
changeset
|
1153 def _applydiff(ui, fp, patcher, copyfn, changed, strip=1, |
91c58cf54eee
patch: refactor applydiff to allow for mempatching
Augie Fackler <durin42@gmail.com>
parents:
10965
diff
changeset
|
1154 sourcefile=None, eolmode='strict'): |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1155 rejects = 0 |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1156 err = 0 |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1157 current_file = None |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1158 gitpatches = None |
7391
27d304c8cc03
patch: pass an opener to patchfile
Patrick Mezard <pmezard@gmail.com>
parents:
7389
diff
changeset
|
1159 opener = util.opener(os.getcwd()) |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1160 |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1161 def closefile(): |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1162 if not current_file: |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1163 return 0 |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1164 current_file.close() |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1165 return len(current_file.rej) |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1166 |
10128
ea7c392f2b08
patch: drop eol normalization fast-path for 'lf' and 'crlf'
Patrick Mezard <pmezard@gmail.com>
parents:
10127
diff
changeset
|
1167 for state, values in iterhunks(ui, fp, sourcefile): |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1168 if state == 'hunk': |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1169 if not current_file: |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1170 continue |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1171 current_hunk = values |
9393
23c4e772c172
patch: remove the unused, broken reverse() function
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9392
diff
changeset
|
1172 ret = current_file.apply(current_hunk) |
4899
1b7bbc4349e7
patch.py: don't mark files as changed unless they have actually been changed
Bryan O'Sullivan <bos@serpentine.com>
parents:
4898
diff
changeset
|
1173 if ret >= 0: |
7150
6d1d61bb2984
patch: map changed files to patchmeta directly
Patrick Mezard <pmezard@gmail.com>
parents:
7149
diff
changeset
|
1174 changed.setdefault(current_file.fname, None) |
4899
1b7bbc4349e7
patch.py: don't mark files as changed unless they have actually been changed
Bryan O'Sullivan <bos@serpentine.com>
parents:
4898
diff
changeset
|
1175 if ret > 0: |
1b7bbc4349e7
patch.py: don't mark files as changed unless they have actually been changed
Bryan O'Sullivan <bos@serpentine.com>
parents:
4898
diff
changeset
|
1176 err = 1 |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1177 elif state == 'file': |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1178 rejects += closefile() |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1179 afile, bfile, first_hunk = values |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1180 try: |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1181 if sourcefile: |
10966
91c58cf54eee
patch: refactor applydiff to allow for mempatching
Augie Fackler <durin42@gmail.com>
parents:
10965
diff
changeset
|
1182 current_file = patcher(ui, sourcefile, opener, |
91c58cf54eee
patch: refactor applydiff to allow for mempatching
Augie Fackler <durin42@gmail.com>
parents:
10965
diff
changeset
|
1183 eolmode=eolmode) |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1184 else: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1185 current_file, missing = selectfile(afile, bfile, |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1186 first_hunk, strip) |
10966
91c58cf54eee
patch: refactor applydiff to allow for mempatching
Augie Fackler <durin42@gmail.com>
parents:
10965
diff
changeset
|
1187 current_file = patcher(ui, current_file, opener, |
91c58cf54eee
patch: refactor applydiff to allow for mempatching
Augie Fackler <durin42@gmail.com>
parents:
10965
diff
changeset
|
1188 missing=missing, eolmode=eolmode) |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1189 except PatchError, err: |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1190 ui.warn(str(err) + '\n') |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1191 current_file, current_hunk = None, None |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1192 rejects += 1 |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1193 continue |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1194 elif state == 'git': |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1195 gitpatches = values |
6791
bbd89c9e6012
Check that git patches only touch files under root
Brendan Cully <brendan@kublai.com>
parents:
6520
diff
changeset
|
1196 cwd = os.getcwd() |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1197 for gp in gitpatches: |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1198 if gp.op in ('COPY', 'RENAME'): |
10966
91c58cf54eee
patch: refactor applydiff to allow for mempatching
Augie Fackler <durin42@gmail.com>
parents:
10965
diff
changeset
|
1199 copyfn(gp.oldpath, gp.path, cwd) |
7150
6d1d61bb2984
patch: map changed files to patchmeta directly
Patrick Mezard <pmezard@gmail.com>
parents:
7149
diff
changeset
|
1200 changed[gp.path] = gp |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1201 else: |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1202 raise util.Abort(_('unsupported parser state: %s') % state) |
5649
a583117b536a
patch: move NoHunk detection up with parsing code
Patrick Mezard <pmezard@gmail.com>
parents:
5581
diff
changeset
|
1203 |
5650
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1204 rejects += closefile() |
5d3e2f918d65
patch: move diff parsing in iterhunks generator
Patrick Mezard <pmezard@gmail.com>
parents:
5649
diff
changeset
|
1205 |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1206 if rejects: |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1207 return -1 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4778
diff
changeset
|
1208 return err |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
1209 |
7402
bffdab64dfbb
import: add similarity option (issue295)
Brendan Cully <brendan@kublai.com>
parents:
7392
diff
changeset
|
1210 def updatedir(ui, repo, patches, similarity=0): |
2933
439fd013360d
Move import's working dir update code into patch.updatedir
Brendan Cully <brendan@kublai.com>
parents:
2922
diff
changeset
|
1211 '''Update dirstate after patch application according to metadata''' |
439fd013360d
Move import's working dir update code into patch.updatedir
Brendan Cully <brendan@kublai.com>
parents:
2922
diff
changeset
|
1212 if not patches: |
439fd013360d
Move import's working dir update code into patch.updatedir
Brendan Cully <brendan@kublai.com>
parents:
2922
diff
changeset
|
1213 return |
439fd013360d
Move import's working dir update code into patch.updatedir
Brendan Cully <brendan@kublai.com>
parents:
2922
diff
changeset
|
1214 copies = [] |
8461
88f317e7d280
patch: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8396
diff
changeset
|
1215 removes = set() |
2933
439fd013360d
Move import's working dir update code into patch.updatedir
Brendan Cully <brendan@kublai.com>
parents:
2922
diff
changeset
|
1216 cfiles = patches.keys() |
439fd013360d
Move import's working dir update code into patch.updatedir
Brendan Cully <brendan@kublai.com>
parents:
2922
diff
changeset
|
1217 cwd = repo.getcwd() |
439fd013360d
Move import's working dir update code into patch.updatedir
Brendan Cully <brendan@kublai.com>
parents:
2922
diff
changeset
|
1218 if cwd: |
4229
24c22a3f2ef8
pass repo.root to util.pathto() in preparation for the next patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4106
diff
changeset
|
1219 cfiles = [util.pathto(repo.root, cwd, f) for f in patches.keys()] |
2933
439fd013360d
Move import's working dir update code into patch.updatedir
Brendan Cully <brendan@kublai.com>
parents:
2922
diff
changeset
|
1220 for f in patches: |
7150
6d1d61bb2984
patch: map changed files to patchmeta directly
Patrick Mezard <pmezard@gmail.com>
parents:
7149
diff
changeset
|
1221 gp = patches[f] |
6d1d61bb2984
patch: map changed files to patchmeta directly
Patrick Mezard <pmezard@gmail.com>
parents:
7149
diff
changeset
|
1222 if not gp: |
6d1d61bb2984
patch: map changed files to patchmeta directly
Patrick Mezard <pmezard@gmail.com>
parents:
7149
diff
changeset
|
1223 continue |
6d1d61bb2984
patch: map changed files to patchmeta directly
Patrick Mezard <pmezard@gmail.com>
parents:
7149
diff
changeset
|
1224 if gp.op == 'RENAME': |
5403
477136fa6571
Always copy the necessary files before applying a git patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5265
diff
changeset
|
1225 copies.append((gp.oldpath, gp.path)) |
8461
88f317e7d280
patch: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8396
diff
changeset
|
1226 removes.add(gp.oldpath) |
7150
6d1d61bb2984
patch: map changed files to patchmeta directly
Patrick Mezard <pmezard@gmail.com>
parents:
7149
diff
changeset
|
1227 elif gp.op == 'COPY': |
5403
477136fa6571
Always copy the necessary files before applying a git patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5265
diff
changeset
|
1228 copies.append((gp.oldpath, gp.path)) |
7150
6d1d61bb2984
patch: map changed files to patchmeta directly
Patrick Mezard <pmezard@gmail.com>
parents:
7149
diff
changeset
|
1229 elif gp.op == 'DELETE': |
8461
88f317e7d280
patch: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8396
diff
changeset
|
1230 removes.add(gp.path) |
5403
477136fa6571
Always copy the necessary files before applying a git patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5265
diff
changeset
|
1231 for src, dst in copies: |
4917
126f527b3ba3
Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents:
4900
diff
changeset
|
1232 repo.copy(src, dst) |
7402
bffdab64dfbb
import: add similarity option (issue295)
Brendan Cully <brendan@kublai.com>
parents:
7392
diff
changeset
|
1233 if (not similarity) and removes: |
8209
a1a5a57efe90
replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents:
8090
diff
changeset
|
1234 repo.remove(sorted(removes), True) |
2933
439fd013360d
Move import's working dir update code into patch.updatedir
Brendan Cully <brendan@kublai.com>
parents:
2922
diff
changeset
|
1235 for f in patches: |
7150
6d1d61bb2984
patch: map changed files to patchmeta directly
Patrick Mezard <pmezard@gmail.com>
parents:
7149
diff
changeset
|
1236 gp = patches[f] |
2933
439fd013360d
Move import's working dir update code into patch.updatedir
Brendan Cully <brendan@kublai.com>
parents:
2922
diff
changeset
|
1237 if gp and gp.mode: |
7149
01a056c54385
patch: patchmeta gives (islink, isexec) tuple instead of int mode
Patrick Mezard <pmezard@gmail.com>
parents:
7148
diff
changeset
|
1238 islink, isexec = gp.mode |
7570
e05aa73ce2b7
use repo.wjoin(f) instead of os.path.join(repo.root, f)
Martin Geisler <mg@daimi.au.dk>
parents:
7547
diff
changeset
|
1239 dst = repo.wjoin(gp.path) |
3588
45574a225632
git patch: create empty added files
Brendan Cully <brendan@kublai.com>
parents:
3554
diff
changeset
|
1240 # patch won't create empty files |
7150
6d1d61bb2984
patch: map changed files to patchmeta directly
Patrick Mezard <pmezard@gmail.com>
parents:
7149
diff
changeset
|
1241 if gp.op == 'ADD' and not os.path.exists(dst): |
7149
01a056c54385
patch: patchmeta gives (islink, isexec) tuple instead of int mode
Patrick Mezard <pmezard@gmail.com>
parents:
7148
diff
changeset
|
1242 flags = (isexec and 'x' or '') + (islink and 'l' or '') |
5706 | 1243 repo.wwrite(gp.path, '', flags) |
7517
49f34b43cf90
patch: handle git patches that remove symlinks (issue1438)
Brendan Cully <brendan@kublai.com>
parents:
7507
diff
changeset
|
1244 elif gp.op != 'DELETE': |
7149
01a056c54385
patch: patchmeta gives (islink, isexec) tuple instead of int mode
Patrick Mezard <pmezard@gmail.com>
parents:
7148
diff
changeset
|
1245 util.set_flags(dst, islink, isexec) |
7402
bffdab64dfbb
import: add similarity option (issue295)
Brendan Cully <brendan@kublai.com>
parents:
7392
diff
changeset
|
1246 cmdutil.addremove(repo, cfiles, similarity=similarity) |
2933
439fd013360d
Move import's working dir update code into patch.updatedir
Brendan Cully <brendan@kublai.com>
parents:
2922
diff
changeset
|
1247 files = patches.keys() |
439fd013360d
Move import's working dir update code into patch.updatedir
Brendan Cully <brendan@kublai.com>
parents:
2922
diff
changeset
|
1248 files.extend([r for r in removes if r not in files]) |
8209
a1a5a57efe90
replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents:
8090
diff
changeset
|
1249 return sorted(files) |
2933
439fd013360d
Move import's working dir update code into patch.updatedir
Brendan Cully <brendan@kublai.com>
parents:
2922
diff
changeset
|
1250 |
7151
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1251 def externalpatch(patcher, args, patchname, ui, strip, cwd, files): |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1252 """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
|
1253 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
|
1254 |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1255 fuzz = False |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1256 if cwd: |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1257 args.append('-d %s' % util.shellquote(cwd)) |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1258 fp = util.popen('%s %s -p%d < %s' % (patcher, ' '.join(args), strip, |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1259 util.shellquote(patchname))) |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1260 |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1261 for line in fp: |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1262 line = line.rstrip() |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1263 ui.note(line + '\n') |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1264 if line.startswith('patching file '): |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1265 pf = util.parse_patch_output(line) |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1266 printed_file = False |
7247
c4461ea8b4c8
patch: fix patched files records in externalpatcher()
Patrick Mezard <pmezard@gmail.com>
parents:
7244
diff
changeset
|
1267 files.setdefault(pf, None) |
7151
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1268 elif line.find('with fuzz') >= 0: |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1269 fuzz = True |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1270 if not printed_file: |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1271 ui.warn(pf + '\n') |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1272 printed_file = True |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1273 ui.warn(line + '\n') |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1274 elif line.find('saving rejects to file') >= 0: |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1275 ui.warn(line + '\n') |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1276 elif line.find('FAILED') >= 0: |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1277 if not printed_file: |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1278 ui.warn(pf + '\n') |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1279 printed_file = True |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1280 ui.warn(line + '\n') |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1281 code = fp.close() |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1282 if code: |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1283 raise PatchError(_("patch command failed: %s") % |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1284 util.explain_exit(code)[0]) |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1285 return fuzz |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1286 |
9683
5c8651e2f5e0
patch: don't use mutable object as default argument
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9682
diff
changeset
|
1287 def internalpatch(patchobj, ui, strip, cwd, files=None, eolmode='strict'): |
7151
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1288 """use builtin patch to apply <patchobj> to the working directory. |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1289 returns whether patch was applied with fuzz factor.""" |
8810
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
1290 |
9683
5c8651e2f5e0
patch: don't use mutable object as default argument
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9682
diff
changeset
|
1291 if files is None: |
5c8651e2f5e0
patch: don't use mutable object as default argument
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9682
diff
changeset
|
1292 files = {} |
8810
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
1293 if eolmode is None: |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
1294 eolmode = ui.config('patch', 'eol', 'strict') |
10101
155fe35534d3
patch: propagate eolmode down to patchfile
Martin Geisler <mg@lazybytes.net>
parents:
9725
diff
changeset
|
1295 if eolmode.lower() not in eolmodes: |
8810
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
1296 raise util.Abort(_('Unsupported line endings type: %s') % eolmode) |
10101
155fe35534d3
patch: propagate eolmode down to patchfile
Martin Geisler <mg@lazybytes.net>
parents:
9725
diff
changeset
|
1297 eolmode = eolmode.lower() |
8843
eb7b247a98ea
kill trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8817
diff
changeset
|
1298 |
7151
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1299 try: |
9031
3b76321aa0de
compat: use open() instead of file() everywhere
Alejandro Santos <alejolp@alejolp.com>
parents:
9029
diff
changeset
|
1300 fp = open(patchobj, 'rb') |
7151
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1301 except TypeError: |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1302 fp = patchobj |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1303 if cwd: |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1304 curdir = os.getcwd() |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1305 os.chdir(cwd) |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1306 try: |
10101
155fe35534d3
patch: propagate eolmode down to patchfile
Martin Geisler <mg@lazybytes.net>
parents:
9725
diff
changeset
|
1307 ret = applydiff(ui, fp, files, strip=strip, eolmode=eolmode) |
7151
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1308 finally: |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1309 if cwd: |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1310 os.chdir(curdir) |
10203
6e26e3c2083f
patch: explicitely close input patch files when leaving
Patrick Mezard <pmezard@gmail.com>
parents:
10135
diff
changeset
|
1311 if fp != patchobj: |
6e26e3c2083f
patch: explicitely close input patch files when leaving
Patrick Mezard <pmezard@gmail.com>
parents:
10135
diff
changeset
|
1312 fp.close() |
7151
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1313 if ret < 0: |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1314 raise PatchError |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1315 return ret > 0 |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1316 |
9683
5c8651e2f5e0
patch: don't use mutable object as default argument
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9682
diff
changeset
|
1317 def patch(patchname, ui, strip=1, cwd=None, files=None, eolmode='strict'): |
8810
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
1318 """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
|
1319 |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
1320 '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
|
1321 - '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
|
1322 - '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
|
1323 - '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
|
1324 - 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
|
1325 '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
|
1326 |
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
1327 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
|
1328 """ |
7151
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1329 patcher = ui.config('ui', 'patch') |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1330 args = [] |
9683
5c8651e2f5e0
patch: don't use mutable object as default argument
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9682
diff
changeset
|
1331 if files is None: |
5c8651e2f5e0
patch: don't use mutable object as default argument
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9682
diff
changeset
|
1332 files = {} |
7151
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1333 try: |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1334 if patcher: |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1335 return externalpatch(patcher, args, patchname, ui, strip, cwd, |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1336 files) |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1337 else: |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1338 try: |
8810
ac92775b3b80
Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents:
8778
diff
changeset
|
1339 return internalpatch(patchname, ui, strip, cwd, files, eolmode) |
7151
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1340 except NoHunks: |
10751
440786f7f18b
patch: warn when the internal patcher fails
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10749
diff
changeset
|
1341 ui.warn(_('internal patcher failed\n' |
440786f7f18b
patch: warn when the internal patcher fails
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10749
diff
changeset
|
1342 'please report details to ' |
440786f7f18b
patch: warn when the internal patcher fails
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10749
diff
changeset
|
1343 'http://mercurial.selenic.com/bts/\n' |
440786f7f18b
patch: warn when the internal patcher fails
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10749
diff
changeset
|
1344 'or mercurial@selenic.com\n')) |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1345 patcher = (util.find_exe('gpatch') or util.find_exe('patch') |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1346 or 'patch') |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9393
diff
changeset
|
1347 ui.debug('no valid hunks found; trying with %r instead\n' % |
7151
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1348 patcher) |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1349 if util.needbinarypatch(): |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1350 args.append('--binary') |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1351 return externalpatch(patcher, args, patchname, ui, strip, cwd, |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1352 files) |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1353 except PatchError, err: |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1354 s = str(err) |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1355 if s: |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1356 raise util.Abort(s) |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1357 else: |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1358 raise util.Abort(_('patch failed to apply')) |
b5bc5293021c
patch: change functions definition order for readability
Patrick Mezard <pmezard@gmail.com>
parents:
7150
diff
changeset
|
1359 |
5033
1b07668b8cc3
patch: remove unused parameter from b85diff
Bryan O'Sullivan <bos@serpentine.com>
parents:
4965
diff
changeset
|
1360 def b85diff(to, tn): |
3367
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
1361 '''print base85-encoded binary diff''' |
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
1362 def gitindex(text): |
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
1363 if not text: |
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
1364 return '0' * 40 |
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
1365 l = len(text) |
6470
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6467
diff
changeset
|
1366 s = util.sha1('blob %d\0' % l) |
3367
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
1367 s.update(text) |
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
1368 return s.hexdigest() |
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
1369 |
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
1370 def fmtline(line): |
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
1371 l = len(line) |
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
1372 if l <= 26: |
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
1373 l = chr(ord('A') + l - 1) |
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
1374 else: |
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
1375 l = chr(l - 26 + ord('a') - 1) |
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
1376 return '%c%s\n' % (l, base85.b85encode(line, True)) |
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
1377 |
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
1378 def chunk(text, csize=52): |
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
1379 l = len(text) |
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
1380 i = 0 |
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
1381 while i < l: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1382 yield text[i:i + csize] |
3367
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
1383 i += csize |
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
1384 |
4105
ed46895aa38c
git binary patches: use hashes to detect identical files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4092
diff
changeset
|
1385 tohash = gitindex(to) |
ed46895aa38c
git binary patches: use hashes to detect identical files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4092
diff
changeset
|
1386 tnhash = gitindex(tn) |
ed46895aa38c
git binary patches: use hashes to detect identical files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4092
diff
changeset
|
1387 if tohash == tnhash: |
4106
797dbdd4d7e1
git binary patches: don't print the header for identical files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4105
diff
changeset
|
1388 return "" |
797dbdd4d7e1
git binary patches: don't print the header for identical files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4105
diff
changeset
|
1389 |
3367
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
1390 # TODO: deltas |
4106
797dbdd4d7e1
git binary patches: don't print the header for identical files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4105
diff
changeset
|
1391 ret = ['index %s..%s\nGIT binary patch\nliteral %s\n' % |
797dbdd4d7e1
git binary patches: don't print the header for identical files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4105
diff
changeset
|
1392 (tohash, tnhash, len(tn))] |
797dbdd4d7e1
git binary patches: don't print the header for identical files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4105
diff
changeset
|
1393 for l in chunk(zlib.compress(tn)): |
797dbdd4d7e1
git binary patches: don't print the header for identical files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4105
diff
changeset
|
1394 ret.append(fmtline(l)) |
797dbdd4d7e1
git binary patches: don't print the header for identical files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4105
diff
changeset
|
1395 ret.append('\n') |
797dbdd4d7e1
git binary patches: don't print the header for identical files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4105
diff
changeset
|
1396 return ''.join(ret) |
3367
7f486971d263
Add git-1.4 binary patch support
Brendan Cully <brendan@kublai.com>
parents:
3329
diff
changeset
|
1397 |
10189
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1398 class GitDiffRequired(Exception): |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1399 pass |
7198
df79ee9b6278
patch: extract local function addmodehdr
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7186
diff
changeset
|
1400 |
10615
3bb438ce4458
patch/diff: move diff related code next to each other
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10611
diff
changeset
|
1401 def diffopts(ui, opts=None, untrusted=False): |
3bb438ce4458
patch/diff: move diff related code next to each other
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10611
diff
changeset
|
1402 def get(key, name=None, getter=ui.configbool): |
3bb438ce4458
patch/diff: move diff related code next to each other
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10611
diff
changeset
|
1403 return ((opts and opts.get(key)) or |
3bb438ce4458
patch/diff: move diff related code next to each other
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10611
diff
changeset
|
1404 getter('diff', name or key, None, untrusted=untrusted)) |
3bb438ce4458
patch/diff: move diff related code next to each other
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10611
diff
changeset
|
1405 return mdiff.diffopts( |
3bb438ce4458
patch/diff: move diff related code next to each other
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10611
diff
changeset
|
1406 text=opts and opts.get('text'), |
3bb438ce4458
patch/diff: move diff related code next to each other
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10611
diff
changeset
|
1407 git=get('git'), |
3bb438ce4458
patch/diff: move diff related code next to each other
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10611
diff
changeset
|
1408 nodates=get('nodates'), |
3bb438ce4458
patch/diff: move diff related code next to each other
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10611
diff
changeset
|
1409 showfunc=get('show_function', 'showfunc'), |
3bb438ce4458
patch/diff: move diff related code next to each other
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10611
diff
changeset
|
1410 ignorews=get('ignore_all_space', 'ignorews'), |
3bb438ce4458
patch/diff: move diff related code next to each other
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10611
diff
changeset
|
1411 ignorewsamount=get('ignore_space_change', 'ignorewsamount'), |
3bb438ce4458
patch/diff: move diff related code next to each other
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10611
diff
changeset
|
1412 ignoreblanklines=get('ignore_blank_lines', 'ignoreblanklines'), |
3bb438ce4458
patch/diff: move diff related code next to each other
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10611
diff
changeset
|
1413 context=get('unified', getter=ui.config)) |
3bb438ce4458
patch/diff: move diff related code next to each other
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10611
diff
changeset
|
1414 |
10189
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1415 def diff(repo, node1=None, node2=None, match=None, changes=None, opts=None, |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1416 losedatafn=None): |
7308
b6f5490effbf
patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7267
diff
changeset
|
1417 '''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
|
1418 working directory. |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
1419 |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
1420 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
|
1421 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
|
1422 |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1423 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
|
1424 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
|
1425 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
|
1426 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
|
1427 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
|
1428 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
|
1429 necessary. |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1430 ''' |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
1431 |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
1432 if opts is None: |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
1433 opts = mdiff.defaultopts |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
1434 |
9725
3f522d2fa633
diff: add --inverse option
Yannick Gingras <ygingras@ygingras.net>
parents:
9712
diff
changeset
|
1435 if not node1 and not node2: |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
1436 node1 = repo.dirstate.parents()[0] |
2934
2f190e998eb3
Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents:
2933
diff
changeset
|
1437 |
9123
360f61c2919f
Make patch.diff filelog cache LRU of 20 files. Fixes issue1738.
Brendan Cully <brendan@kublai.com>
parents:
8891
diff
changeset
|
1438 def lrugetfilectx(): |
360f61c2919f
Make patch.diff filelog cache LRU of 20 files. Fixes issue1738.
Brendan Cully <brendan@kublai.com>
parents:
8891
diff
changeset
|
1439 cache = {} |
360f61c2919f
Make patch.diff filelog cache LRU of 20 files. Fixes issue1738.
Brendan Cully <brendan@kublai.com>
parents:
8891
diff
changeset
|
1440 order = [] |
360f61c2919f
Make patch.diff filelog cache LRU of 20 files. Fixes issue1738.
Brendan Cully <brendan@kublai.com>
parents:
8891
diff
changeset
|
1441 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
|
1442 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
|
1443 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
|
1444 if len(cache) > 20: |
360f61c2919f
Make patch.diff filelog cache LRU of 20 files. Fixes issue1738.
Brendan Cully <brendan@kublai.com>
parents:
8891
diff
changeset
|
1445 del cache[order.pop(0)] |
9684
618af2034ca6
patch: use the public ctx API instead of the internals
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9683
diff
changeset
|
1446 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
|
1447 else: |
360f61c2919f
Make patch.diff filelog cache LRU of 20 files. Fixes issue1738.
Brendan Cully <brendan@kublai.com>
parents:
8891
diff
changeset
|
1448 order.remove(f) |
360f61c2919f
Make patch.diff filelog cache LRU of 20 files. Fixes issue1738.
Brendan Cully <brendan@kublai.com>
parents:
8891
diff
changeset
|
1449 order.append(f) |
360f61c2919f
Make patch.diff filelog cache LRU of 20 files. Fixes issue1738.
Brendan Cully <brendan@kublai.com>
parents:
8891
diff
changeset
|
1450 return fctx |
360f61c2919f
Make patch.diff filelog cache LRU of 20 files. Fixes issue1738.
Brendan Cully <brendan@kublai.com>
parents:
8891
diff
changeset
|
1451 return getfilectx |
360f61c2919f
Make patch.diff filelog cache LRU of 20 files. Fixes issue1738.
Brendan Cully <brendan@kublai.com>
parents:
8891
diff
changeset
|
1452 getfilectx = lrugetfilectx() |
2934
2f190e998eb3
Teach mq about git patches
Brendan Cully <brendan@kublai.com>
parents:
2933
diff
changeset
|
1453 |
6747
f6c00b17387c
use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents:
6743
diff
changeset
|
1454 ctx1 = repo[node1] |
7090
7b5c063b0b94
diff: pass contexts to status
Matt Mackall <mpm@selenic.com>
parents:
6953
diff
changeset
|
1455 ctx2 = repo[node2] |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
1456 |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
1457 if not changes: |
7090
7b5c063b0b94
diff: pass contexts to status
Matt Mackall <mpm@selenic.com>
parents:
6953
diff
changeset
|
1458 changes = repo.status(ctx1, ctx2, match=match) |
6760
4faaa0535ea7
status: clean up all users for unknown files
Matt Mackall <mpm@selenic.com>
parents:
6758
diff
changeset
|
1459 modified, added, removed = changes[:3] |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
1460 |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
1461 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
|
1462 return [] |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1463 |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1464 revs = None |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1465 if not repo.ui.quiet: |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1466 hexfunc = repo.ui.debugflag and hex or short |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1467 revs = [hexfunc(node) for node in [node1, node2] if node] |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1468 |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1469 copy = {} |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1470 if opts.git or opts.upgrade: |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1471 copy = copies.copies(repo, ctx1, ctx2, repo[nullid])[0] |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1472 |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1473 difffn = lambda opts, losedata: trydiff(repo, revs, ctx1, ctx2, |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1474 modified, added, removed, copy, getfilectx, opts, losedata) |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1475 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
|
1476 try: |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1477 def losedata(fn): |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1478 if not losedatafn or not losedatafn(fn=fn): |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1479 raise GitDiffRequired() |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1480 # 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
|
1481 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
|
1482 except GitDiffRequired: |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1483 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
|
1484 else: |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1485 return difffn(opts, None) |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1486 |
10818
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1487 def difflabel(func, *args, **kw): |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1488 '''yields 2-tuples of (output, label) based on the output of func()''' |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1489 prefixes = [('diff', 'diff.diffline'), |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1490 ('copy', 'diff.extended'), |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1491 ('rename', 'diff.extended'), |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1492 ('old', 'diff.extended'), |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1493 ('new', 'diff.extended'), |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1494 ('deleted', 'diff.extended'), |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1495 ('---', 'diff.file_a'), |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1496 ('+++', 'diff.file_b'), |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1497 ('@@', 'diff.hunk'), |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1498 ('-', 'diff.deleted'), |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1499 ('+', 'diff.inserted')] |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1500 |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1501 for chunk in func(*args, **kw): |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1502 lines = chunk.split('\n') |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1503 for i, line in enumerate(lines): |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1504 if i != 0: |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1505 yield ('\n', '') |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1506 stripline = line |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1507 if line and line[0] in '+-': |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1508 # highlight trailing whitespace, but only in changed lines |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1509 stripline = line.rstrip() |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1510 for prefix, label in prefixes: |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1511 if stripline.startswith(prefix): |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1512 yield (stripline, label) |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1513 break |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1514 else: |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1515 yield (line, '') |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1516 if line != stripline: |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1517 yield (line[len(stripline):], 'diff.trailingwhitespace') |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1518 |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1519 def diffui(*args, **kw): |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1520 '''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
|
1521 return difflabel(diff, *args, **kw) |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1522 |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1523 |
10189
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1524 def _addmodehdr(header, omode, nmode): |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1525 if omode != nmode: |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1526 header.append('old mode %s\n' % omode) |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1527 header.append('new mode %s\n' % nmode) |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1528 |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1529 def trydiff(repo, revs, ctx1, ctx2, modified, added, removed, |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1530 copy, getfilectx, opts, losedatafn): |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
1531 |
7090
7b5c063b0b94
diff: pass contexts to status
Matt Mackall <mpm@selenic.com>
parents:
6953
diff
changeset
|
1532 date1 = util.datestr(ctx1.date()) |
7b5c063b0b94
diff: pass contexts to status
Matt Mackall <mpm@selenic.com>
parents:
6953
diff
changeset
|
1533 man1 = ctx1.manifest() |
3967
dccb83241dd0
patch: use contexts for diff
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3963
diff
changeset
|
1534 |
10189
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1535 gone = set() |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1536 gitmode = {'l': '120000', 'x': '100755', '': '100644'} |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
1537 |
10466
d1f209bb9564
patch: separate reverse copy data (issue1959)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
10384
diff
changeset
|
1538 copyto = dict([(v, k) for k, v in copy.items()]) |
d1f209bb9564
patch: separate reverse copy data (issue1959)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
10384
diff
changeset
|
1539 |
2907 | 1540 if opts.git: |
10189
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1541 revs = None |
3996
c190df14338c
exec: add execfunc to simplify exec flag support on non-exec filesystems
Matt Mackall <mpm@selenic.com>
parents:
3970
diff
changeset
|
1542 |
8209
a1a5a57efe90
replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents:
8090
diff
changeset
|
1543 for f in sorted(modified + added + removed): |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
1544 to = None |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
1545 tn = None |
2907 | 1546 dodiff = True |
3329
319358e6bd96
Don't generate git diff header for empty diffs
Brendan Cully <brendan@kublai.com>
parents:
3231
diff
changeset
|
1547 header = [] |
3967
dccb83241dd0
patch: use contexts for diff
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3963
diff
changeset
|
1548 if f in man1: |
dccb83241dd0
patch: use contexts for diff
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3963
diff
changeset
|
1549 to = getfilectx(f, ctx1).data() |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
1550 if f not in removed: |
3967
dccb83241dd0
patch: use contexts for diff
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3963
diff
changeset
|
1551 tn = getfilectx(f, ctx2).data() |
5482
e5eedd74e70f
Use both the from and to name in mdiff.unidiff.
Dustin Sallings <dustin@spy.net>
parents:
5481
diff
changeset
|
1552 a, b = f, f |
10189
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1553 if opts.git or losedatafn: |
2907 | 1554 if f in added: |
6743 | 1555 mode = gitmode[ctx2.flags(f)] |
10466
d1f209bb9564
patch: separate reverse copy data (issue1959)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
10384
diff
changeset
|
1556 if f in copy or f in copyto: |
10189
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1557 if opts.git: |
10466
d1f209bb9564
patch: separate reverse copy data (issue1959)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
10384
diff
changeset
|
1558 if f in copy: |
d1f209bb9564
patch: separate reverse copy data (issue1959)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
10384
diff
changeset
|
1559 a = copy[f] |
d1f209bb9564
patch: separate reverse copy data (issue1959)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
10384
diff
changeset
|
1560 else: |
d1f209bb9564
patch: separate reverse copy data (issue1959)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
10384
diff
changeset
|
1561 a = copyto[f] |
10189
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1562 omode = gitmode[man1.flags(a)] |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1563 _addmodehdr(header, omode, mode) |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1564 if a in removed and a not in gone: |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1565 op = 'rename' |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1566 gone.add(a) |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1567 else: |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1568 op = 'copy' |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1569 header.append('%s from %s\n' % (op, a)) |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1570 header.append('%s to %s\n' % (op, f)) |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1571 to = getfilectx(a, ctx1).data() |
3702
70c3ee224c08
Don't generate git patches that rename a file to multiple destinations
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3701
diff
changeset
|
1572 else: |
10189
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1573 losedatafn(f) |
2907 | 1574 else: |
10189
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1575 if opts.git: |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1576 header.append('new file mode %s\n' % mode) |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1577 elif ctx2.flags(f): |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1578 losedatafn(f) |
4092
4ced663bebf0
git patches: handle renames of binary files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3900
diff
changeset
|
1579 if util.binary(tn): |
10189
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1580 if opts.git: |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1581 dodiff = 'binary' |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1582 else: |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1583 losedatafn(f) |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1584 if not opts.git and not tn: |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1585 # regular diffs cannot represent new empty file |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1586 losedatafn(f) |
2907 | 1587 elif f in removed: |
10189
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1588 if opts.git: |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1589 # have we already reported a copy above? |
10467
16c68fd720ab
patch: remove useless copy, cleanup
Patrick Mezard <pmezard@gmail.com>
parents:
10466
diff
changeset
|
1590 if ((f in copy and copy[f] in added |
16c68fd720ab
patch: remove useless copy, cleanup
Patrick Mezard <pmezard@gmail.com>
parents:
10466
diff
changeset
|
1591 and copyto[copy[f]] == f) or |
16c68fd720ab
patch: remove useless copy, cleanup
Patrick Mezard <pmezard@gmail.com>
parents:
10466
diff
changeset
|
1592 (f in copyto and copyto[f] in added |
16c68fd720ab
patch: remove useless copy, cleanup
Patrick Mezard <pmezard@gmail.com>
parents:
10466
diff
changeset
|
1593 and copy[copyto[f]] == f)): |
10189
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1594 dodiff = False |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1595 else: |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1596 header.append('deleted file mode %s\n' % |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1597 gitmode[man1.flags(f)]) |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1598 elif not to: |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1599 # regular diffs cannot represent empty file deletion |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1600 losedatafn(f) |
2907 | 1601 else: |
10189
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1602 oflag = man1.flags(f) |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1603 nflag = ctx2.flags(f) |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1604 binary = util.binary(to) or util.binary(tn) |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1605 if opts.git: |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1606 _addmodehdr(header, gitmode[oflag], gitmode[nflag]) |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1607 if binary: |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1608 dodiff = 'binary' |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1609 elif binary or nflag != oflag: |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1610 losedatafn(f) |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1611 if opts.git: |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1612 header.insert(0, mdiff.diffline(revs, a, b, opts)) |
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10151
diff
changeset
|
1613 |
4106
797dbdd4d7e1
git binary patches: don't print the header for identical files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4105
diff
changeset
|
1614 if dodiff: |
797dbdd4d7e1
git binary patches: don't print the header for identical files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4105
diff
changeset
|
1615 if dodiff == 'binary': |
5033
1b07668b8cc3
patch: remove unused parameter from b85diff
Bryan O'Sullivan <bos@serpentine.com>
parents:
4965
diff
changeset
|
1616 text = b85diff(to, tn) |
4106
797dbdd4d7e1
git binary patches: don't print the header for identical files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4105
diff
changeset
|
1617 else: |
4108 | 1618 text = mdiff.unidiff(to, date1, |
1619 # ctx2 date may be dynamic | |
1620 tn, util.datestr(ctx2.date()), | |
10151
c7355a0e1f39
patch: make git diffline generation more explicit
Patrick Mezard <pmezard@gmail.com>
parents:
10136
diff
changeset
|
1621 a, b, revs, opts=opts) |
7308
b6f5490effbf
patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7267
diff
changeset
|
1622 if header and (text or len(header) > 1): |
b6f5490effbf
patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7267
diff
changeset
|
1623 yield ''.join(header) |
b6f5490effbf
patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7267
diff
changeset
|
1624 if text: |
b6f5490effbf
patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7267
diff
changeset
|
1625 yield text |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2868
diff
changeset
|
1626 |
7547
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1627 def diffstatdata(lines): |
7664
3cc74ee75b0d
diffstat: don't fail on merges
Patrick Mezard <pmezard@gmail.com>
parents:
7615
diff
changeset
|
1628 filename, adds, removes = None, 0, 0 |
7547
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1629 for line in lines: |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1630 if line.startswith('diff'): |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1631 if filename: |
9642
7d17794f08a9
diffstat: with --git, mark binary files with Bin
Brodie Rao <me+hg@dackz.net>
parents:
9639
diff
changeset
|
1632 isbinary = adds == 0 and removes == 0 |
7d17794f08a9
diffstat: with --git, mark binary files with Bin
Brodie Rao <me+hg@dackz.net>
parents:
9639
diff
changeset
|
1633 yield (filename, adds, removes, isbinary) |
7547
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1634 # set numbers to 0 anyway when starting new file |
7664
3cc74ee75b0d
diffstat: don't fail on merges
Patrick Mezard <pmezard@gmail.com>
parents:
7615
diff
changeset
|
1635 adds, removes = 0, 0 |
7547
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1636 if line.startswith('diff --git'): |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1637 filename = gitre.search(line).group(1) |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1638 else: |
8761
0289f384e1e5
Generally replace "file name" with "filename" in help and comments.
timeless <timeless@gmail.com>
parents:
8632
diff
changeset
|
1639 # format: "diff -r ... -r ... filename" |
7547
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1640 filename = line.split(None, 5)[-1] |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1641 elif line.startswith('+') and not line.startswith('+++'): |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1642 adds += 1 |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1643 elif line.startswith('-') and not line.startswith('---'): |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1644 removes += 1 |
7670
e5f445c94226
kill some trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7664
diff
changeset
|
1645 if filename: |
9642
7d17794f08a9
diffstat: with --git, mark binary files with Bin
Brodie Rao <me+hg@dackz.net>
parents:
9639
diff
changeset
|
1646 isbinary = adds == 0 and removes == 0 |
7d17794f08a9
diffstat: with --git, mark binary files with Bin
Brodie Rao <me+hg@dackz.net>
parents:
9639
diff
changeset
|
1647 yield (filename, adds, removes, isbinary) |
7547
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1648 |
9642
7d17794f08a9
diffstat: with --git, mark binary files with Bin
Brodie Rao <me+hg@dackz.net>
parents:
9639
diff
changeset
|
1649 def diffstat(lines, width=80, git=False): |
7547
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1650 output = [] |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1651 stats = list(diffstatdata(lines)) |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1652 |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1653 maxtotal, maxname = 0, 0 |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1654 totaladds, totalremoves = 0, 0 |
9642
7d17794f08a9
diffstat: with --git, mark binary files with Bin
Brodie Rao <me+hg@dackz.net>
parents:
9639
diff
changeset
|
1655 hasbinary = False |
7d17794f08a9
diffstat: with --git, mark binary files with Bin
Brodie Rao <me+hg@dackz.net>
parents:
9639
diff
changeset
|
1656 for filename, adds, removes, isbinary in stats: |
7547
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1657 totaladds += adds |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1658 totalremoves += removes |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1659 maxname = max(maxname, len(filename)) |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1660 maxtotal = max(maxtotal, adds + removes) |
9642
7d17794f08a9
diffstat: with --git, mark binary files with Bin
Brodie Rao <me+hg@dackz.net>
parents:
9639
diff
changeset
|
1661 if isbinary: |
7d17794f08a9
diffstat: with --git, mark binary files with Bin
Brodie Rao <me+hg@dackz.net>
parents:
9639
diff
changeset
|
1662 hasbinary = True |
7547
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1663 |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1664 countwidth = len(str(maxtotal)) |
9642
7d17794f08a9
diffstat: with --git, mark binary files with Bin
Brodie Rao <me+hg@dackz.net>
parents:
9639
diff
changeset
|
1665 if hasbinary and countwidth < 3: |
7d17794f08a9
diffstat: with --git, mark binary files with Bin
Brodie Rao <me+hg@dackz.net>
parents:
9639
diff
changeset
|
1666 countwidth = 3 |
9330
be2a13153372
diffstat: scale adds/removes proportionally to graph width
Brodie Rao <me+hg@dackz.net>
parents:
9328
diff
changeset
|
1667 graphwidth = width - countwidth - maxname - 6 |
7547
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1668 if graphwidth < 10: |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1669 graphwidth = 10 |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1670 |
9330
be2a13153372
diffstat: scale adds/removes proportionally to graph width
Brodie Rao <me+hg@dackz.net>
parents:
9328
diff
changeset
|
1671 def scale(i): |
be2a13153372
diffstat: scale adds/removes proportionally to graph width
Brodie Rao <me+hg@dackz.net>
parents:
9328
diff
changeset
|
1672 if maxtotal <= graphwidth: |
be2a13153372
diffstat: scale adds/removes proportionally to graph width
Brodie Rao <me+hg@dackz.net>
parents:
9328
diff
changeset
|
1673 return i |
be2a13153372
diffstat: scale adds/removes proportionally to graph width
Brodie Rao <me+hg@dackz.net>
parents:
9328
diff
changeset
|
1674 # 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
|
1675 # 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
|
1676 # 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
|
1677 return max(i * graphwidth // maxtotal, int(bool(i))) |
7547
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1678 |
9642
7d17794f08a9
diffstat: with --git, mark binary files with Bin
Brodie Rao <me+hg@dackz.net>
parents:
9639
diff
changeset
|
1679 for filename, adds, removes, isbinary in stats: |
7d17794f08a9
diffstat: with --git, mark binary files with Bin
Brodie Rao <me+hg@dackz.net>
parents:
9639
diff
changeset
|
1680 if git and isbinary: |
7d17794f08a9
diffstat: with --git, mark binary files with Bin
Brodie Rao <me+hg@dackz.net>
parents:
9639
diff
changeset
|
1681 count = 'Bin' |
7d17794f08a9
diffstat: with --git, mark binary files with Bin
Brodie Rao <me+hg@dackz.net>
parents:
9639
diff
changeset
|
1682 else: |
7d17794f08a9
diffstat: with --git, mark binary files with Bin
Brodie Rao <me+hg@dackz.net>
parents:
9639
diff
changeset
|
1683 count = adds + removes |
9330
be2a13153372
diffstat: scale adds/removes proportionally to graph width
Brodie Rao <me+hg@dackz.net>
parents:
9328
diff
changeset
|
1684 pluses = '+' * scale(adds) |
be2a13153372
diffstat: scale adds/removes proportionally to graph width
Brodie Rao <me+hg@dackz.net>
parents:
9328
diff
changeset
|
1685 minuses = '-' * scale(removes) |
9639
5384a22ab698
diffstat: print 0 instead of nothing for 0 adds or removes
Brodie Rao <me+hg@dackz.net>
parents:
9598
diff
changeset
|
1686 output.append(' %-*s | %*s %s%s\n' % (maxname, filename, countwidth, |
9642
7d17794f08a9
diffstat: with --git, mark binary files with Bin
Brodie Rao <me+hg@dackz.net>
parents:
9639
diff
changeset
|
1687 count, pluses, minuses)) |
7547
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1688 |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1689 if stats: |
9331
9d68d9deda51
patch: marked string for translation
Martin Geisler <mg@lazybytes.net>
parents:
9330
diff
changeset
|
1690 output.append(_(' %d files changed, %d insertions(+), %d deletions(-)\n') |
7860
162fd31bbd93
diffstat: use width 80 by default and avoid division by zero
Matt Mackall <mpm@selenic.com>
parents:
7783
diff
changeset
|
1691 % (len(stats), totaladds, totalremoves)) |
7547
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1692 |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7521
diff
changeset
|
1693 return ''.join(output) |
10818
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1694 |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1695 def diffstatui(*args, **kw): |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1696 '''like diffstat(), but yields 2-tuples of (output, label) for |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1697 ui.write() |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1698 ''' |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1699 |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1700 for line in diffstat(*args, **kw).splitlines(): |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1701 if line and line[-1] in '+-': |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1702 name, graph = line.rsplit(' ', 1) |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1703 yield (name + ' ', '') |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1704 m = re.search(r'\++', graph) |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1705 if m: |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1706 yield (m.group(0), 'diffstat.inserted') |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1707 m = re.search(r'-+', graph) |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1708 if m: |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1709 yield (m.group(0), 'diffstat.deleted') |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1710 else: |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1711 yield (line, '') |
d14d45fae927
diff: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents:
10751
diff
changeset
|
1712 yield ('\n', '') |