Show More
@@ -748,20 +748,21 b' class patchfile(object):' | |||||
748 | self.hash = {} |
|
748 | self.hash = {} | |
749 | for x, s in enumerate(self.lines): |
|
749 | for x, s in enumerate(self.lines): | |
750 | self.hash.setdefault(s, []).append(x) |
|
750 | self.hash.setdefault(s, []).append(x) | |
751 | if h.hunk[-1][0] != ' ': |
|
|||
752 | # if the hunk tried to put something at the bottom of the file |
|
|||
753 | # override the start line and use eof here |
|
|||
754 | search_start = len(self.lines) |
|
|||
755 | else: |
|
|||
756 | search_start = orig_start + self.skew |
|
|||
757 |
|
751 | |||
758 | for fuzzlen in xrange(3): |
|
752 | for fuzzlen in xrange(3): | |
759 | for toponly in [True, False]: |
|
753 | for toponly in [True, False]: | |
760 | old, oldstart, new, newstart = h.fuzzit(fuzzlen, toponly) |
|
754 | old, oldstart, new, newstart = h.fuzzit(fuzzlen, toponly) | |
|
755 | oldstart = oldstart + self.offset + self.skew | |||
|
756 | oldstart = min(oldstart, len(self.lines)) | |||
|
757 | if old: | |||
|
758 | cand = self.findlines(old[0][1:], oldstart) | |||
|
759 | else: | |||
|
760 | # Only adding lines with no or fuzzed context, just | |||
|
761 | # take the skew in account | |||
|
762 | cand = [oldstart] | |||
761 |
|
763 | |||
762 | cand = self.findlines(old[0][1:], search_start) |
|
|||
763 | for l in cand: |
|
764 | for l in cand: | |
764 | if diffhelpers.testhunk(old, self.lines, l) == 0: |
|
765 | if not old or diffhelpers.testhunk(old, self.lines, l) == 0: | |
765 | self.lines[l : l + len(old)] = new |
|
766 | self.lines[l : l + len(old)] = new | |
766 | self.offset += len(new) - len(old) |
|
767 | self.offset += len(new) - len(old) | |
767 | self.skew = l - orig_start |
|
768 | self.skew = l - orig_start |
@@ -996,3 +996,79 b' import a unified diff with no lines of c' | |||||
996 | c2 |
|
996 | c2 | |
997 | c3 |
|
997 | c3 | |
998 | c4 |
|
998 | c4 | |
|
999 | ||||
|
1000 | Test corner case involving fuzz and skew | |||
|
1001 | ||||
|
1002 | $ hg init morecornercases | |||
|
1003 | $ cd morecornercases | |||
|
1004 | ||||
|
1005 | $ cat > 01-no-context-beginning-of-file.diff <<EOF | |||
|
1006 | > diff --git a/a b/a | |||
|
1007 | > --- a/a | |||
|
1008 | > +++ b/a | |||
|
1009 | > @@ -1,0 +1,1 @@ | |||
|
1010 | > +line | |||
|
1011 | > EOF | |||
|
1012 | ||||
|
1013 | $ cat > 02-no-context-middle-of-file.diff <<EOF | |||
|
1014 | > diff --git a/a b/a | |||
|
1015 | > --- a/a | |||
|
1016 | > +++ b/a | |||
|
1017 | > @@ -1,1 +1,1 @@ | |||
|
1018 | > -2 | |||
|
1019 | > +add some skew | |||
|
1020 | > @@ -2,0 +2,1 @@ | |||
|
1021 | > +line | |||
|
1022 | > EOF | |||
|
1023 | ||||
|
1024 | $ cat > 03-no-context-end-of-file.diff <<EOF | |||
|
1025 | > diff --git a/a b/a | |||
|
1026 | > --- a/a | |||
|
1027 | > +++ b/a | |||
|
1028 | > @@ -10,0 +10,1 @@ | |||
|
1029 | > +line | |||
|
1030 | > EOF | |||
|
1031 | ||||
|
1032 | $ cat > a <<EOF | |||
|
1033 | > 1 | |||
|
1034 | > 2 | |||
|
1035 | > 3 | |||
|
1036 | > 4 | |||
|
1037 | > EOF | |||
|
1038 | $ hg ci -Am adda a | |||
|
1039 | $ for p in *.diff; do | |||
|
1040 | > hg import -v --no-commit $p | |||
|
1041 | > cat a | |||
|
1042 | > hg revert -aqC a | |||
|
1043 | > # patch -p1 < $p | |||
|
1044 | > # cat a | |||
|
1045 | > # hg revert -aC a | |||
|
1046 | > done | |||
|
1047 | applying 01-no-context-beginning-of-file.diff | |||
|
1048 | patching file a | |||
|
1049 | applied to working directory | |||
|
1050 | 1 | |||
|
1051 | line | |||
|
1052 | 2 | |||
|
1053 | 3 | |||
|
1054 | 4 | |||
|
1055 | applying 02-no-context-middle-of-file.diff | |||
|
1056 | patching file a | |||
|
1057 | Hunk #1 succeeded at 2 (offset 1 lines). | |||
|
1058 | Hunk #2 succeeded at 4 (offset 1 lines). | |||
|
1059 | applied to working directory | |||
|
1060 | 1 | |||
|
1061 | add some skew | |||
|
1062 | 3 | |||
|
1063 | line | |||
|
1064 | 4 | |||
|
1065 | applying 03-no-context-end-of-file.diff | |||
|
1066 | patching file a | |||
|
1067 | Hunk #1 succeeded at 5 (offset -6 lines). | |||
|
1068 | applied to working directory | |||
|
1069 | 1 | |||
|
1070 | 2 | |||
|
1071 | 3 | |||
|
1072 | 4 | |||
|
1073 | line | |||
|
1074 |
General Comments 0
You need to be logged in to leave comments.
Login now