Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/patch.py @ 6280:9db24a36d182
patch: check filename is /dev/null for creation or deletion (issue 1033)
Otherwise, file creation or deletion is ambiguous with file being filled or
emptied.
author | Patrick Mezard <pmezard@gmail.com> |
---|---|
date | Sun, 16 Mar 2008 00:35:12 +0100 |
parents | fda369b5779c |
children | bace1990ab12 |
comparison
equal
deleted
inserted
replaced
6279:c50ac875ffcb | 6280:9db24a36d182 |
---|---|
503 self.ui.warn(_("Hunk #%d FAILED at %d\n") % (h.number, orig_start)) | 503 self.ui.warn(_("Hunk #%d FAILED at %d\n") % (h.number, orig_start)) |
504 self.rej.append(h) | 504 self.rej.append(h) |
505 return -1 | 505 return -1 |
506 | 506 |
507 class hunk: | 507 class hunk: |
508 def __init__(self, desc, num, lr, context, gitpatch=None): | 508 def __init__(self, desc, num, lr, context, create=False, remove=False): |
509 self.number = num | 509 self.number = num |
510 self.desc = desc | 510 self.desc = desc |
511 self.hunk = [ desc ] | 511 self.hunk = [ desc ] |
512 self.a = [] | 512 self.a = [] |
513 self.b = [] | 513 self.b = [] |
514 if context: | 514 if context: |
515 self.read_context_hunk(lr) | 515 self.read_context_hunk(lr) |
516 else: | 516 else: |
517 self.read_unified_hunk(lr) | 517 self.read_unified_hunk(lr) |
518 self.gitpatch = gitpatch | 518 self.create = create |
519 self.remove = remove and not create | |
519 | 520 |
520 def read_unified_hunk(self, lr): | 521 def read_unified_hunk(self, lr): |
521 m = unidesc.match(self.desc) | 522 m = unidesc.match(self.desc) |
522 if not m: | 523 if not m: |
523 raise PatchError(_("bad hunk #%d") % self.number) | 524 raise PatchError(_("bad hunk #%d") % self.number) |
638 self.desc = "@@ -%d,%d +%d,%d @@\n" % (self.starta, self.lena, | 639 self.desc = "@@ -%d,%d +%d,%d @@\n" % (self.starta, self.lena, |
639 self.startb, self.lenb) | 640 self.startb, self.lenb) |
640 self.hunk[0] = self.desc | 641 self.hunk[0] = self.desc |
641 | 642 |
642 def reverse(self): | 643 def reverse(self): |
644 self.create, self.remove = self.remove, self.create | |
643 origlena = self.lena | 645 origlena = self.lena |
644 origstarta = self.starta | 646 origstarta = self.starta |
645 self.lena = self.lenb | 647 self.lena = self.lenb |
646 self.starta = self.startb | 648 self.starta = self.startb |
647 self.lenb = origlena | 649 self.lenb = origlena |
668 | 670 |
669 def complete(self): | 671 def complete(self): |
670 return len(self.a) == self.lena and len(self.b) == self.lenb | 672 return len(self.a) == self.lena and len(self.b) == self.lenb |
671 | 673 |
672 def createfile(self): | 674 def createfile(self): |
673 create = self.gitpatch is None or self.gitpatch.op == 'ADD' | 675 return self.starta == 0 and self.lena == 0 and self.create |
674 return self.starta == 0 and self.lena == 0 and create | |
675 | 676 |
676 def rmfile(self): | 677 def rmfile(self): |
677 remove = self.gitpatch is None or self.gitpatch.op == 'DELETE' | 678 return self.startb == 0 and self.lenb == 0 and self.remove |
678 return self.startb == 0 and self.lenb == 0 and remove | |
679 | 679 |
680 def fuzzit(self, l, fuzz, toponly): | 680 def fuzzit(self, l, fuzz, toponly): |
681 # this removes context lines from the top and bottom of list 'l'. It | 681 # this removes context lines from the top and bottom of list 'l'. It |
682 # checks the hunk to make sure only context lines are removed, and then | 682 # checks the hunk to make sure only context lines are removed, and then |
683 # returns a new shortened list of lines. | 683 # returns a new shortened list of lines. |
910 ((context or context == None) and x.startswith('***************')))): | 910 ((context or context == None) and x.startswith('***************')))): |
911 try: | 911 try: |
912 if context == None and x.startswith('***************'): | 912 if context == None and x.startswith('***************'): |
913 context = True | 913 context = True |
914 gpatch = changed.get(bfile[2:], (None, None))[1] | 914 gpatch = changed.get(bfile[2:], (None, None))[1] |
915 current_hunk = hunk(x, hunknum + 1, lr, context, gpatch) | 915 create = afile == '/dev/null' or gpatch and gpatch.op == 'ADD' |
916 remove = bfile == '/dev/null' or gpatch and gpatch.op == 'DELETE' | |
917 current_hunk = hunk(x, hunknum + 1, lr, context, create, remove) | |
916 except PatchError, err: | 918 except PatchError, err: |
917 ui.debug(err) | 919 ui.debug(err) |
918 current_hunk = None | 920 current_hunk = None |
919 continue | 921 continue |
920 hunknum += 1 | 922 hunknum += 1 |