##// END OF EJS Templates
patch: handle empty vs no file in git patches (issue906)
Patrick Mezard -
r5852:03ce5a91 default
parent child Browse files
Show More
@@ -499,7 +499,7 b' class patchfile:'
499 return -1
499 return -1
500
500
501 class hunk:
501 class hunk:
502 def __init__(self, desc, num, lr, context):
502 def __init__(self, desc, num, lr, context, gitpatch=None):
503 self.number = num
503 self.number = num
504 self.desc = desc
504 self.desc = desc
505 self.hunk = [ desc ]
505 self.hunk = [ desc ]
@@ -509,6 +509,7 b' class hunk:'
509 self.read_context_hunk(lr)
509 self.read_context_hunk(lr)
510 else:
510 else:
511 self.read_unified_hunk(lr)
511 self.read_unified_hunk(lr)
512 self.gitpatch = gitpatch
512
513
513 def read_unified_hunk(self, lr):
514 def read_unified_hunk(self, lr):
514 m = unidesc.match(self.desc)
515 m = unidesc.match(self.desc)
@@ -663,10 +664,12 b' class hunk:'
663 return len(self.a) == self.lena and len(self.b) == self.lenb
664 return len(self.a) == self.lena and len(self.b) == self.lenb
664
665
665 def createfile(self):
666 def createfile(self):
666 return self.starta == 0 and self.lena == 0
667 create = self.gitpatch is None or self.gitpatch.op == 'ADD'
668 return self.starta == 0 and self.lena == 0 and create
667
669
668 def rmfile(self):
670 def rmfile(self):
669 return self.startb == 0 and self.lenb == 0
671 remove = self.gitpatch is None or self.gitpatch.op == 'DELETE'
672 return self.startb == 0 and self.lenb == 0 and remove
670
673
671 def fuzzit(self, l, fuzz, toponly):
674 def fuzzit(self, l, fuzz, toponly):
672 # this removes context lines from the top and bottom of list 'l'. It
675 # this removes context lines from the top and bottom of list 'l'. It
@@ -918,7 +921,8 b' def applydiff(ui, fp, changed, strip=1, '
918 try:
921 try:
919 if context == None and x.startswith('***************'):
922 if context == None and x.startswith('***************'):
920 context = True
923 context = True
921 current_hunk = hunk(x, hunknum + 1, lr, context)
924 gpatch = changed.get(bfile[2:], (None, None))[1]
925 current_hunk = hunk(x, hunknum + 1, lr, context, gpatch)
922 except PatchError, err:
926 except PatchError, err:
923 ui.debug(err)
927 ui.debug(err)
924 current_hunk = None
928 current_hunk = None
@@ -153,3 +153,31 b' echo line0 >> a'
153 hg ci -m brancha
153 hg ci -m brancha
154 hg import -v tip.patch
154 hg import -v tip.patch
155 cd ..
155 cd ..
156
157 # Test hunk touching empty files (issue906)
158 hg init empty
159 cd empty
160 touch a
161 touch b1
162 touch c1
163 echo d > d
164 hg ci -Am init
165 echo a > a
166 echo b > b1
167 hg mv b1 b2
168 echo c > c1
169 hg copy c1 c2
170 rm d
171 touch d
172 hg diff --git
173 hg ci -m empty
174 hg export --git tip > empty.diff
175 hg up -C 0
176 hg import empty.diff
177 for name in a b1 b2 c1 c2 d;
178 do
179 echo % $name file
180 test -f $name && cat $name
181 done
182 cd ..
183
@@ -132,3 +132,48 b' applying tip.patch'
132 patching file a
132 patching file a
133 Hunk #1 succeeded at 1 with fuzz 2 (offset -2 lines).
133 Hunk #1 succeeded at 1 with fuzz 2 (offset -2 lines).
134 a
134 a
135 adding a
136 adding b1
137 adding c1
138 adding d
139 diff --git a/a b/a
140 --- a/a
141 +++ b/a
142 @@ -0,0 +1,1 @@
143 +a
144 diff --git a/b1 b/b2
145 rename from b1
146 rename to b2
147 --- a/b1
148 +++ b/b2
149 @@ -0,0 +1,1 @@
150 +b
151 diff --git a/c1 b/c1
152 --- a/c1
153 +++ b/c1
154 @@ -0,0 +1,1 @@
155 +c
156 diff --git a/c1 b/c2
157 copy from c1
158 copy to c2
159 --- a/c1
160 +++ b/c2
161 @@ -0,0 +1,1 @@
162 +c
163 diff --git a/d b/d
164 --- a/d
165 +++ b/d
166 @@ -1,1 +0,0 @@
167 -d
168 4 files updated, 0 files merged, 2 files removed, 0 files unresolved
169 applying empty.diff
170 % a file
171 a
172 % b1 file
173 % b2 file
174 b
175 % c1 file
176 c
177 % c2 file
178 c
179 % d file
General Comments 0
You need to be logged in to leave comments. Login now