mercurial/patch.py
changeset 24417 f2e1e097cda1
parent 24416 f07047a506d1
child 24433 f5f4dc115fb2
equal deleted inserted replaced
24416:f07047a506d1 24417:f2e1e097cda1
  2057         buildopts['noprefix'] = get('noprefix', forceplain=False)
  2057         buildopts['noprefix'] = get('noprefix', forceplain=False)
  2058 
  2058 
  2059     return mdiff.diffopts(**buildopts)
  2059     return mdiff.diffopts(**buildopts)
  2060 
  2060 
  2061 def diff(repo, node1=None, node2=None, match=None, changes=None, opts=None,
  2061 def diff(repo, node1=None, node2=None, match=None, changes=None, opts=None,
  2062          losedatafn=None, prefix=''):
  2062          losedatafn=None, prefix='', relroot=''):
  2063     '''yields diff of changes to files between two nodes, or node and
  2063     '''yields diff of changes to files between two nodes, or node and
  2064     working directory.
  2064     working directory.
  2065 
  2065 
  2066     if node1 is None, use first dirstate parent instead.
  2066     if node1 is None, use first dirstate parent instead.
  2067     if node2 is None, compare node1 with working directory.
  2067     if node2 is None, compare node1 with working directory.
  2074     to None, patches will always be upgraded to git format when
  2074     to None, patches will always be upgraded to git format when
  2075     necessary.
  2075     necessary.
  2076 
  2076 
  2077     prefix is a filename prefix that is prepended to all filenames on
  2077     prefix is a filename prefix that is prepended to all filenames on
  2078     display (used for subrepos).
  2078     display (used for subrepos).
  2079     '''
  2079 
       
  2080     relroot, if not empty, must be normalized with a trailing /. Any match
       
  2081     patterns that fall outside it will be ignored.'''
  2080 
  2082 
  2081     if opts is None:
  2083     if opts is None:
  2082         opts = mdiff.defaultopts
  2084         opts = mdiff.defaultopts
  2083 
  2085 
  2084     if not node1 and not node2:
  2086     if not node1 and not node2:
  2118 
  2120 
  2119     copy = {}
  2121     copy = {}
  2120     if opts.git or opts.upgrade:
  2122     if opts.git or opts.upgrade:
  2121         copy = copies.pathcopies(ctx1, ctx2)
  2123         copy = copies.pathcopies(ctx1, ctx2)
  2122 
  2124 
       
  2125     if relroot is not None:
       
  2126         # XXX this would ideally be done in the matcher, but that is generally
       
  2127         # meant to 'or' patterns, not 'and' them. In this case we need to 'and'
       
  2128         # all the patterns from the matcher with relroot.
       
  2129         def filterrel(l):
       
  2130             return [f for f in l if f.startswith(relroot)]
       
  2131         modified = filterrel(modified)
       
  2132         added = filterrel(added)
       
  2133         removed = filterrel(removed)
       
  2134         # filter out copies where either side isn't inside the relative root
       
  2135         copy = dict(((dst, src) for (dst, src) in copy.iteritems()
       
  2136                      if dst.startswith(relroot)
       
  2137                      and src.startswith(relroot)))
       
  2138 
  2123     def difffn(opts, losedata):
  2139     def difffn(opts, losedata):
  2124         return trydiff(repo, revs, ctx1, ctx2, modified, added, removed,
  2140         return trydiff(repo, revs, ctx1, ctx2, modified, added, removed,
  2125                        copy, getfilectx, opts, losedata, prefix, '')
  2141                        copy, getfilectx, opts, losedata, prefix, relroot)
  2126     if opts.upgrade and not opts.git:
  2142     if opts.upgrade and not opts.git:
  2127         try:
  2143         try:
  2128             def losedata(fn):
  2144             def losedata(fn):
  2129                 if not losedatafn or not losedatafn(fn=fn):
  2145                 if not losedatafn or not losedatafn(fn=fn):
  2130                     raise GitDiffRequired
  2146                     raise GitDiffRequired