mercurial/patch.py
changeset 7150 6d1d61bb2984
parent 7149 01a056c54385
child 7151 b5bc5293021c
equal deleted inserted replaced
7149:01a056c54385 7150:6d1d61bb2984
   923         if ((sourcefile or state == BFILE) and ((not context and x[0] == '@') or
   923         if ((sourcefile or state == BFILE) and ((not context and x[0] == '@') or
   924             ((context or context == None) and x.startswith('***************')))):
   924             ((context or context == None) and x.startswith('***************')))):
   925             try:
   925             try:
   926                 if context == None and x.startswith('***************'):
   926                 if context == None and x.startswith('***************'):
   927                     context = True
   927                     context = True
   928                 gpatch = changed.get(bfile[2:], (None, None))[1]
   928                 gpatch = changed.get(bfile[2:])
   929                 create = afile == '/dev/null' or gpatch and gpatch.op == 'ADD'
   929                 create = afile == '/dev/null' or gpatch and gpatch.op == 'ADD'
   930                 remove = bfile == '/dev/null' or gpatch and gpatch.op == 'DELETE'
   930                 remove = bfile == '/dev/null' or gpatch and gpatch.op == 'DELETE'
   931                 current_hunk = hunk(x, hunknum + 1, lr, context, create, remove)
   931                 current_hunk = hunk(x, hunknum + 1, lr, context, create, remove)
   932             except PatchError, err:
   932             except PatchError, err:
   933                 ui.debug(err)
   933                 ui.debug(err)
   936             hunknum += 1
   936             hunknum += 1
   937             if emitfile:
   937             if emitfile:
   938                 emitfile = False
   938                 emitfile = False
   939                 yield 'file', (afile, bfile, current_hunk)
   939                 yield 'file', (afile, bfile, current_hunk)
   940         elif state == BFILE and x.startswith('GIT binary patch'):
   940         elif state == BFILE and x.startswith('GIT binary patch'):
   941             current_hunk = binhunk(changed[bfile[2:]][1])
   941             current_hunk = binhunk(changed[bfile[2:]])
   942             hunknum += 1
   942             hunknum += 1
   943             if emitfile:
   943             if emitfile:
   944                 emitfile = False
   944                 emitfile = False
   945                 yield 'file', (afile, bfile, current_hunk)
   945                 yield 'file', (afile, bfile, current_hunk)
   946             current_hunk.extract(fp)
   946             current_hunk.extract(fp)
   952                 if not git:
   952                 if not git:
   953                     git = True
   953                     git = True
   954                     fp, dopatch, gitpatches = scangitpatch(fp, x)
   954                     fp, dopatch, gitpatches = scangitpatch(fp, x)
   955                     yield 'git', gitpatches
   955                     yield 'git', gitpatches
   956                     for gp in gitpatches:
   956                     for gp in gitpatches:
   957                         changed[gp.path] = (gp.op, gp)
   957                         changed[gp.path] = gp
   958                 # else error?
   958                 # else error?
   959                 # copy/rename + modify should modify target, not source
   959                 # copy/rename + modify should modify target, not source
   960                 gitop = changed.get(bfile[2:], (None, None))[0]
   960                 gp = changed.get(bfile[2:])
   961                 if gitop in ('COPY', 'DELETE', 'RENAME'):
   961                 if gp and gp.op in ('COPY', 'DELETE', 'RENAME'):
   962                     afile = bfile
   962                     afile = bfile
   963                     gitworkdone = True
   963                     gitworkdone = True
   964             newfile = True
   964             newfile = True
   965         elif x.startswith('---'):
   965         elif x.startswith('---'):
   966             # check for a unified diff
   966             # check for a unified diff
  1024             if not current_file:
  1024             if not current_file:
  1025                 continue
  1025                 continue
  1026             current_hunk = values
  1026             current_hunk = values
  1027             ret = current_file.apply(current_hunk, reverse)
  1027             ret = current_file.apply(current_hunk, reverse)
  1028             if ret >= 0:
  1028             if ret >= 0:
  1029                 changed.setdefault(current_file.fname, (None, None))
  1029                 changed.setdefault(current_file.fname, None)
  1030                 if ret > 0:
  1030                 if ret > 0:
  1031                     err = 1
  1031                     err = 1
  1032         elif state == 'file':
  1032         elif state == 'file':
  1033             rejects += closefile()
  1033             rejects += closefile()
  1034             afile, bfile, first_hunk = values
  1034             afile, bfile, first_hunk = values
  1050             for gp in gitpatches:
  1050             for gp in gitpatches:
  1051                 if gp.op in ('COPY', 'RENAME'):
  1051                 if gp.op in ('COPY', 'RENAME'):
  1052                     src, dst = [util.canonpath(cwd, cwd, x)
  1052                     src, dst = [util.canonpath(cwd, cwd, x)
  1053                                 for x in [gp.oldpath, gp.path]]
  1053                                 for x in [gp.oldpath, gp.path]]
  1054                     copyfile(src, dst)
  1054                     copyfile(src, dst)
  1055                 changed[gp.path] = (gp.op, gp)
  1055                 changed[gp.path] = gp
  1056         else:
  1056         else:
  1057             raise util.Abort(_('unsupported parser state: %s') % state)
  1057             raise util.Abort(_('unsupported parser state: %s') % state)
  1058 
  1058 
  1059     rejects += closefile()
  1059     rejects += closefile()
  1060 
  1060 
  1085     cfiles = patches.keys()
  1085     cfiles = patches.keys()
  1086     cwd = repo.getcwd()
  1086     cwd = repo.getcwd()
  1087     if cwd:
  1087     if cwd:
  1088         cfiles = [util.pathto(repo.root, cwd, f) for f in patches.keys()]
  1088         cfiles = [util.pathto(repo.root, cwd, f) for f in patches.keys()]
  1089     for f in patches:
  1089     for f in patches:
  1090         ctype, gp = patches[f]
  1090         gp = patches[f]
  1091         if ctype == 'RENAME':
  1091         if not gp:
       
  1092             continue
       
  1093         if gp.op == 'RENAME':
  1092             copies.append((gp.oldpath, gp.path))
  1094             copies.append((gp.oldpath, gp.path))
  1093             removes[gp.oldpath] = 1
  1095             removes[gp.oldpath] = 1
  1094         elif ctype == 'COPY':
  1096         elif gp.op == 'COPY':
  1095             copies.append((gp.oldpath, gp.path))
  1097             copies.append((gp.oldpath, gp.path))
  1096         elif ctype == 'DELETE':
  1098         elif gp.op == 'DELETE':
  1097             removes[gp.path] = 1
  1099             removes[gp.path] = 1
  1098     for src, dst in copies:
  1100     for src, dst in copies:
  1099         repo.copy(src, dst)
  1101         repo.copy(src, dst)
  1100     removes = removes.keys()
  1102     removes = removes.keys()
  1101     if removes:
  1103     if removes:
  1102         repo.remove(util.sort(removes), True)
  1104         repo.remove(util.sort(removes), True)
  1103     for f in patches:
  1105     for f in patches:
  1104         ctype, gp = patches[f]
  1106         gp = patches[f]
  1105         if gp and gp.mode:
  1107         if gp and gp.mode:
  1106             islink, isexec = gp.mode
  1108             islink, isexec = gp.mode
  1107             dst = os.path.join(repo.root, gp.path)
  1109             dst = os.path.join(repo.root, gp.path)
  1108             # patch won't create empty files
  1110             # patch won't create empty files
  1109             if ctype == 'ADD' and not os.path.exists(dst):
  1111             if gp.op == 'ADD' and not os.path.exists(dst):
  1110                 flags = (isexec and 'x' or '') + (islink and 'l' or '')
  1112                 flags = (isexec and 'x' or '') + (islink and 'l' or '')
  1111                 repo.wwrite(gp.path, '', flags)
  1113                 repo.wwrite(gp.path, '', flags)
  1112             else:
  1114             else:
  1113                 util.set_flags(dst, islink, isexec)
  1115                 util.set_flags(dst, islink, isexec)
  1114     cmdutil.addremove(repo, cfiles)
  1116     cmdutil.addremove(repo, cfiles)