mercurial/patch.py
changeset 3717 9e248cfd8b94
parent 3716 ab5600428b08
child 3886 abaee83ce0a6
child 3899 504dee0abeac
equal deleted inserted replaced
3716:ab5600428b08 3717:9e248cfd8b94
   188     return (dopatch, gitpatches)
   188     return (dopatch, gitpatches)
   189 
   189 
   190 def dogitpatch(patchname, gitpatches, cwd=None):
   190 def dogitpatch(patchname, gitpatches, cwd=None):
   191     """Preprocess git patch so that vanilla patch can handle it"""
   191     """Preprocess git patch so that vanilla patch can handle it"""
   192     def extractbin(fp):
   192     def extractbin(fp):
   193         line = fp.readline().rstrip()
   193         i = [0] # yuck
       
   194         def readline():
       
   195             i[0] += 1
       
   196             return fp.readline().rstrip()
       
   197         line = readline()
   194         while line and not line.startswith('literal '):
   198         while line and not line.startswith('literal '):
   195             line = fp.readline().rstrip()
   199             line = readline()
   196         if not line:
   200         if not line:
   197             return
   201             return None, i[0]
   198         size = int(line[8:])
   202         size = int(line[8:])
   199         dec = []
   203         dec = []
   200         line = fp.readline().rstrip()
   204         line = readline()
   201         while line:
   205         while line:
   202             l = line[0]
   206             l = line[0]
   203             if l <= 'Z' and l >= 'A':
   207             if l <= 'Z' and l >= 'A':
   204                 l = ord(l) - ord('A') + 1
   208                 l = ord(l) - ord('A') + 1
   205             else:
   209             else:
   206                 l = ord(l) - ord('a') + 27
   210                 l = ord(l) - ord('a') + 27
   207             dec.append(base85.b85decode(line[1:])[:l])
   211             dec.append(base85.b85decode(line[1:])[:l])
   208             line = fp.readline().rstrip()
   212             line = readline()
   209         text = zlib.decompress(''.join(dec))
   213         text = zlib.decompress(''.join(dec))
   210         if len(text) != size:
   214         if len(text) != size:
   211             raise util.Abort(_('binary patch is %d bytes, not %d') %
   215             raise util.Abort(_('binary patch is %d bytes, not %d') %
   212                              (len(text), size))
   216                              (len(text), size))
   213         return text
   217         return text, i[0]
   214 
   218 
   215     pf = file(patchname)
   219     pf = file(patchname)
   216     pfline = 1
   220     pfline = 1
   217 
   221 
   218     fd, patchname = tempfile.mkstemp(prefix='hg-patch-')
   222     fd, patchname = tempfile.mkstemp(prefix='hg-patch-')
   228             while pfline < p.lineno:
   232             while pfline < p.lineno:
   229                 tmpfp.write(pf.readline())
   233                 tmpfp.write(pf.readline())
   230                 pfline += 1
   234                 pfline += 1
   231 
   235 
   232             if p.binary:
   236             if p.binary:
   233                 text = extractbin(pf)
   237                 text, delta = extractbin(pf)
   234                 if not text:
   238                 if not text:
   235                     raise util.Abort(_('binary patch extraction failed'))
   239                     raise util.Abort(_('binary patch extraction failed'))
       
   240                 pfline += delta
   236                 if not cwd:
   241                 if not cwd:
   237                     cwd = os.getcwd()
   242                     cwd = os.getcwd()
   238                 absdst = os.path.join(cwd, p.path)
   243                 absdst = os.path.join(cwd, p.path)
   239                 basedir = os.path.dirname(absdst)
   244                 basedir = os.path.dirname(absdst)
   240                 if not os.path.isdir(basedir):
   245                 if not os.path.isdir(basedir):