comparison mercurial/logcmdutil.py @ 41657:d4c9eebdd72d

patch: replace "prefix" and "relroot" arguments by "pathfn" (API) The two arguments serve a very similar purpose: "relroot" is stripped from the front of the path, and then "prefix" (a subrepo path) is added (also to the front). Passing in a function that does that is more generic and will make it easier to respect ui.relative-paths in later patches (don't worry, I'm not going to respect that option for regular patches, only for --stat). I'm deliberately not calling it "uipathfn", because it's generally for producing valid diffs (including when prefix is non-empty), so things like using backslash on Windows is not an option. Differential Revision: https://phab.mercurial-scm.org/D5894
author Martin von Zweigbergk <martinvonz@google.com>
date Wed, 06 Feb 2019 23:12:56 -0800
parents 3d094bfaf885
children ec37db02fc72
comparison
equal deleted inserted replaced
41656:2306158314e9 41657:d4c9eebdd72d
7 7
8 from __future__ import absolute_import 8 from __future__ import absolute_import
9 9
10 import itertools 10 import itertools
11 import os 11 import os
12 import posixpath
12 13
13 from .i18n import _ 14 from .i18n import _
14 from .node import ( 15 from .node import (
15 nullid, 16 nullid,
16 wdirid, 17 wdirid,
63 if root: 64 if root:
64 relroot = pathutil.canonpath(repo.root, repo.getcwd(), root) 65 relroot = pathutil.canonpath(repo.root, repo.getcwd(), root)
65 else: 66 else:
66 relroot = '' 67 relroot = ''
67 copysourcematch = None 68 copysourcematch = None
69 def pathfn(f):
70 return posixpath.join(prefix, f)
68 if relroot != '': 71 if relroot != '':
69 # XXX relative roots currently don't work if the root is within a 72 # XXX relative roots currently don't work if the root is within a
70 # subrepo 73 # subrepo
71 uirelroot = match.uipath(relroot) 74 uirelroot = match.uipath(relroot)
72 relroot += '/' 75 relroot += '/'
77 80
78 relrootmatch = scmutil.match(ctx2, pats=[relroot], default='path') 81 relrootmatch = scmutil.match(ctx2, pats=[relroot], default='path')
79 match = matchmod.intersectmatchers(match, relrootmatch) 82 match = matchmod.intersectmatchers(match, relrootmatch)
80 copysourcematch = relrootmatch 83 copysourcematch = relrootmatch
81 84
85 checkroot = (repo.ui.configbool('devel', 'all-warnings') or
86 repo.ui.configbool('devel', 'check-relroot'))
87 def pathfn(f):
88 if checkroot and not f.startswith(relroot):
89 raise AssertionError(
90 "file %s doesn't start with relroot %s" % (f, relroot))
91 return posixpath.join(prefix, f[len(relroot):])
92
82 if stat: 93 if stat:
83 diffopts = diffopts.copy(context=0, noprefix=False) 94 diffopts = diffopts.copy(context=0, noprefix=False)
84 width = 80 95 width = 80
85 if not ui.plain(): 96 if not ui.plain():
86 width = ui.termwidth() - graphwidth 97 width = ui.termwidth() - graphwidth
87 98
88 chunks = ctx2.diff(ctx1, match, changes, opts=diffopts, prefix=prefix, 99 chunks = ctx2.diff(ctx1, match, changes, opts=diffopts, pathfn=pathfn,
89 relroot=relroot, copysourcematch=copysourcematch, 100 copysourcematch=copysourcematch,
90 hunksfilterfn=hunksfilterfn) 101 hunksfilterfn=hunksfilterfn)
91 102
92 if fp is not None or ui.canwritewithoutlabels(): 103 if fp is not None or ui.canwritewithoutlabels():
93 out = fp or ui 104 out = fp or ui
94 if stat: 105 if stat: