Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/patch.py @ 45957:89a2afe31e82
formating: upgrade to black 20.8b1
This required a couple of small tweaks to un-confuse black, but now it
works. Big formatting changes come from:
* Dramatically improved collection-splitting logic upstream
* Black having a strong (correct IMO) opinion that """ is better than '''
Differential Revision: https://phab.mercurial-scm.org/D9430
author | Augie Fackler <raf@durin42.com> |
---|---|
date | Fri, 27 Nov 2020 17:03:29 -0500 |
parents | ac362d5a7893 |
children | 2cf61e66c6d0 |
comparison
equal
deleted
inserted
replaced
45956:346af7687c6f | 45957:89a2afe31e82 |
---|---|
198 ] | 198 ] |
199 | 199 |
200 | 200 |
201 @contextlib.contextmanager | 201 @contextlib.contextmanager |
202 def extract(ui, fileobj): | 202 def extract(ui, fileobj): |
203 '''extract patch from data read from fileobj. | 203 """extract patch from data read from fileobj. |
204 | 204 |
205 patch can be a normal patch or contained in an email message. | 205 patch can be a normal patch or contained in an email message. |
206 | 206 |
207 return a dictionary. Standard keys are: | 207 return a dictionary. Standard keys are: |
208 - filename, | 208 - filename, |
212 - branch, | 212 - branch, |
213 - node, | 213 - node, |
214 - p1, | 214 - p1, |
215 - p2. | 215 - p2. |
216 Any item can be missing from the dictionary. If filename is missing, | 216 Any item can be missing from the dictionary. If filename is missing, |
217 fileobj did not contain a patch. Caller must unlink filename when done.''' | 217 fileobj did not contain a patch. Caller must unlink filename when done.""" |
218 | 218 |
219 fd, tmpname = pycompat.mkstemp(prefix=b'hg-patch-') | 219 fd, tmpname = pycompat.mkstemp(prefix=b'hg-patch-') |
220 tmpfp = os.fdopen(fd, 'wb') | 220 tmpfp = os.fdopen(fd, 'wb') |
221 try: | 221 try: |
222 yield _extract(ui, fileobj, tmpname, tmpfp) | 222 yield _extract(ui, fileobj, tmpname, tmpfp) |
903 self.write_rej() | 903 self.write_rej() |
904 return len(self.rej) | 904 return len(self.rej) |
905 | 905 |
906 | 906 |
907 class header(object): | 907 class header(object): |
908 """patch header | 908 """patch header""" |
909 """ | |
910 | 909 |
911 diffgit_re = re.compile(b'diff --git a/(.*) b/(.*)$') | 910 diffgit_re = re.compile(b'diff --git a/(.*) b/(.*)$') |
912 diff_re = re.compile(b'diff -r .* (.*)$') | 911 diff_re = re.compile(b'diff -r .* (.*)$') |
913 allhunks_re = re.compile(b'(?:index|deleted file) ') | 912 allhunks_re = re.compile(b'(?:index|deleted file) ') |
914 pretty_re = re.compile(b'(?:new file|deleted file) ') | 913 pretty_re = re.compile(b'(?:new file|deleted file) ') |
1852 del fp | 1851 del fp |
1853 return p.finished() | 1852 return p.finished() |
1854 | 1853 |
1855 | 1854 |
1856 def pathtransform(path, strip, prefix): | 1855 def pathtransform(path, strip, prefix): |
1857 '''turn a path from a patch into a path suitable for the repository | 1856 """turn a path from a patch into a path suitable for the repository |
1858 | 1857 |
1859 prefix, if not empty, is expected to be normalized with a / at the end. | 1858 prefix, if not empty, is expected to be normalized with a / at the end. |
1860 | 1859 |
1861 Returns (stripped components, path in repository). | 1860 Returns (stripped components, path in repository). |
1862 | 1861 |
1871 >>> pathtransform(b' a//b/c ', 2, b'd/e/') | 1870 >>> pathtransform(b' a//b/c ', 2, b'd/e/') |
1872 ('a//b/', 'd/e/c') | 1871 ('a//b/', 'd/e/c') |
1873 >>> pathtransform(b'a/b/c', 3, b'') | 1872 >>> pathtransform(b'a/b/c', 3, b'') |
1874 Traceback (most recent call last): | 1873 Traceback (most recent call last): |
1875 PatchError: unable to strip away 1 of 3 dirs from a/b/c | 1874 PatchError: unable to strip away 1 of 3 dirs from a/b/c |
1876 ''' | 1875 """ |
1877 pathlen = len(path) | 1876 pathlen = len(path) |
1878 i = 0 | 1877 i = 0 |
1879 if strip == 0: | 1878 if strip == 0: |
1880 return b'', prefix + path.rstrip() | 1879 return b'', prefix + path.rstrip() |
1881 count = strip | 1880 count = strip |
2501 pathfn=None, | 2500 pathfn=None, |
2502 copy=None, | 2501 copy=None, |
2503 copysourcematch=None, | 2502 copysourcematch=None, |
2504 hunksfilterfn=None, | 2503 hunksfilterfn=None, |
2505 ): | 2504 ): |
2506 '''yields diff of changes to files between two nodes, or node and | 2505 """yields diff of changes to files between two nodes, or node and |
2507 working directory. | 2506 working directory. |
2508 | 2507 |
2509 if node1 is None, use first dirstate parent instead. | 2508 if node1 is None, use first dirstate parent instead. |
2510 if node2 is None, compare node1 with working directory. | 2509 if node2 is None, compare node1 with working directory. |
2511 | 2510 |
2529 if copysourcematch is not None, then copy sources will be filtered by this | 2528 if copysourcematch is not None, then copy sources will be filtered by this |
2530 matcher | 2529 matcher |
2531 | 2530 |
2532 hunksfilterfn, if not None, should be a function taking a filectx and | 2531 hunksfilterfn, if not None, should be a function taking a filectx and |
2533 hunks generator that may yield filtered hunks. | 2532 hunks generator that may yield filtered hunks. |
2534 ''' | 2533 """ |
2535 if not node1 and not node2: | 2534 if not node1 and not node2: |
2536 node1 = repo.dirstate.p1() | 2535 node1 = repo.dirstate.p1() |
2537 | 2536 |
2538 ctx1 = repo[node1] | 2537 ctx1 = repo[node1] |
2539 ctx2 = repo[node2] | 2538 ctx2 = repo[node2] |
2884 '''like diff(), but yields 2-tuples of (output, label) for ui.write()''' | 2883 '''like diff(), but yields 2-tuples of (output, label) for ui.write()''' |
2885 return difflabel(diff, *args, **kw) | 2884 return difflabel(diff, *args, **kw) |
2886 | 2885 |
2887 | 2886 |
2888 def _filepairs(modified, added, removed, copy, opts): | 2887 def _filepairs(modified, added, removed, copy, opts): |
2889 '''generates tuples (f1, f2, copyop), where f1 is the name of the file | 2888 """generates tuples (f1, f2, copyop), where f1 is the name of the file |
2890 before and f2 is the the name after. For added files, f1 will be None, | 2889 before and f2 is the the name after. For added files, f1 will be None, |
2891 and for removed files, f2 will be None. copyop may be set to None, 'copy' | 2890 and for removed files, f2 will be None. copyop may be set to None, 'copy' |
2892 or 'rename' (the latter two only if opts.git is set).''' | 2891 or 'rename' (the latter two only if opts.git is set).""" |
2893 gone = set() | 2892 gone = set() |
2894 | 2893 |
2895 copyto = {v: k for k, v in copy.items()} | 2894 copyto = {v: k for k, v in copy.items()} |
2896 | 2895 |
2897 addedset, removedset = set(added), set(removed) | 2896 addedset, removedset = set(added), set(removed) |
2946 getfilectx, | 2945 getfilectx, |
2947 opts, | 2946 opts, |
2948 losedatafn, | 2947 losedatafn, |
2949 pathfn, | 2948 pathfn, |
2950 ): | 2949 ): |
2951 '''given input data, generate a diff and yield it in blocks | 2950 """given input data, generate a diff and yield it in blocks |
2952 | 2951 |
2953 If generating a diff would lose data like flags or binary data and | 2952 If generating a diff would lose data like flags or binary data and |
2954 losedatafn is not None, it will be called. | 2953 losedatafn is not None, it will be called. |
2955 | 2954 |
2956 pathfn is applied to every path in the diff output. | 2955 pathfn is applied to every path in the diff output. |
2957 ''' | 2956 """ |
2958 | 2957 |
2959 if opts.noprefix: | 2958 if opts.noprefix: |
2960 aprefix = bprefix = b'' | 2959 aprefix = bprefix = b'' |
2961 else: | 2960 else: |
2962 aprefix = b'a/' | 2961 aprefix = b'a/' |
3077 data2 = (ctx2, fctx2, path2, flag2, content2, date2) | 3076 data2 = (ctx2, fctx2, path2, flag2, content2, date2) |
3078 yield diffcontent(data1, data2, header, binary, opts) | 3077 yield diffcontent(data1, data2, header, binary, opts) |
3079 | 3078 |
3080 | 3079 |
3081 def diffcontent(data1, data2, header, binary, opts): | 3080 def diffcontent(data1, data2, header, binary, opts): |
3082 """ diffs two versions of a file. | 3081 """diffs two versions of a file. |
3083 | 3082 |
3084 data1 and data2 are tuples containg: | 3083 data1 and data2 are tuples containg: |
3085 | 3084 |
3086 * ctx: changeset for the file | 3085 * ctx: changeset for the file |
3087 * fctx: file context for that file | 3086 * fctx: file context for that file |
3239 | 3238 |
3240 return b''.join(output) | 3239 return b''.join(output) |
3241 | 3240 |
3242 | 3241 |
3243 def diffstatui(*args, **kw): | 3242 def diffstatui(*args, **kw): |
3244 '''like diffstat(), but yields 2-tuples of (output, label) for | 3243 """like diffstat(), but yields 2-tuples of (output, label) for |
3245 ui.write() | 3244 ui.write() |
3246 ''' | 3245 """ |
3247 | 3246 |
3248 for line in diffstat(*args, **kw).splitlines(): | 3247 for line in diffstat(*args, **kw).splitlines(): |
3249 if line and line[-1] in b'+-': | 3248 if line and line[-1] in b'+-': |
3250 name, graph = line.rsplit(b' ', 1) | 3249 name, graph = line.rsplit(b' ', 1) |
3251 yield (name + b' ', b'') | 3250 yield (name + b' ', b'') |