mercurial/patch.py
changeset 35062 1706eae096e2
parent 34968 3649c3f2cd90
child 35191 a1d2fc32bb99
equal deleted inserted replaced
35061:e9a8a941950a 35062:1706eae096e2
  1988     patching then normalized according to 'eolmode'.
  1988     patching then normalized according to 'eolmode'.
  1989     """
  1989     """
  1990     return _applydiff(ui, fp, patchfile, backend, store, strip=strip,
  1990     return _applydiff(ui, fp, patchfile, backend, store, strip=strip,
  1991                       prefix=prefix, eolmode=eolmode)
  1991                       prefix=prefix, eolmode=eolmode)
  1992 
  1992 
       
  1993 def _canonprefix(repo, prefix):
       
  1994     if prefix:
       
  1995         prefix = pathutil.canonpath(repo.root, repo.getcwd(), prefix)
       
  1996         if prefix != '':
       
  1997             prefix += '/'
       
  1998     return prefix
       
  1999 
  1993 def _applydiff(ui, fp, patcher, backend, store, strip=1, prefix='',
  2000 def _applydiff(ui, fp, patcher, backend, store, strip=1, prefix='',
  1994                eolmode='strict'):
  2001                eolmode='strict'):
  1995 
  2002     prefix = _canonprefix(backend.repo, prefix)
  1996     if prefix:
       
  1997         prefix = pathutil.canonpath(backend.repo.root, backend.repo.getcwd(),
       
  1998                                     prefix)
       
  1999         if prefix != '':
       
  2000             prefix += '/'
       
  2001     def pstrip(p):
  2003     def pstrip(p):
  2002         return pathtransform(p, strip - 1, prefix)[1]
  2004         return pathtransform(p, strip - 1, prefix)[1]
  2003 
  2005 
  2004     rejects = 0
  2006     rejects = 0
  2005     err = 0
  2007     err = 0
  2181         return _externalpatch(ui, repo, patcher, patchname, strip,
  2183         return _externalpatch(ui, repo, patcher, patchname, strip,
  2182                               files, similarity)
  2184                               files, similarity)
  2183     return internalpatch(ui, repo, patchname, strip, prefix, files, eolmode,
  2185     return internalpatch(ui, repo, patchname, strip, prefix, files, eolmode,
  2184                          similarity)
  2186                          similarity)
  2185 
  2187 
  2186 def changedfiles(ui, repo, patchpath, strip=1):
  2188 def changedfiles(ui, repo, patchpath, strip=1, prefix=''):
  2187     backend = fsbackend(ui, repo.root)
  2189     backend = fsbackend(ui, repo.root)
       
  2190     prefix = _canonprefix(repo, prefix)
  2188     with open(patchpath, 'rb') as fp:
  2191     with open(patchpath, 'rb') as fp:
  2189         changed = set()
  2192         changed = set()
  2190         for state, values in iterhunks(fp):
  2193         for state, values in iterhunks(fp):
  2191             if state == 'file':
  2194             if state == 'file':
  2192                 afile, bfile, first_hunk, gp = values
  2195                 afile, bfile, first_hunk, gp = values
  2193                 if gp:
  2196                 if gp:
  2194                     gp.path = pathtransform(gp.path, strip - 1, '')[1]
  2197                     gp.path = pathtransform(gp.path, strip - 1, prefix)[1]
  2195                     if gp.oldpath:
  2198                     if gp.oldpath:
  2196                         gp.oldpath = pathtransform(gp.oldpath, strip - 1, '')[1]
  2199                         gp.oldpath = pathtransform(gp.oldpath, strip - 1,
       
  2200                                                    prefix)[1]
  2197                 else:
  2201                 else:
  2198                     gp = makepatchmeta(backend, afile, bfile, first_hunk, strip,
  2202                     gp = makepatchmeta(backend, afile, bfile, first_hunk, strip,
  2199                                        '')
  2203                                        prefix)
  2200                 changed.add(gp.path)
  2204                 changed.add(gp.path)
  2201                 if gp.op == 'RENAME':
  2205                 if gp.op == 'RENAME':
  2202                     changed.add(gp.oldpath)
  2206                     changed.add(gp.oldpath)
  2203             elif state not in ('hunk', 'git'):
  2207             elif state not in ('hunk', 'git'):
  2204                 raise error.Abort(_('unsupported parser state: %s') % state)
  2208                 raise error.Abort(_('unsupported parser state: %s') % state)