##// END OF EJS Templates
merge: warn about file deleted in one branch and renamed in other (issue3074)...
Thomas Arendsen Hein -
r16794:98687cdd default
parent child Browse files
Show More
@@ -177,19 +177,22 b' def mergecopies(repo, c1, c2, ca):'
177
177
178 "diverge" is a mapping of source name -> list of destination names
178 "diverge" is a mapping of source name -> list of destination names
179 for divergent renames.
179 for divergent renames.
180
181 "renamedelete" is a mapping of source name -> list of destination
182 names for files deleted in c1 that were renamed in c2 or vice-versa.
180 """
183 """
181 # avoid silly behavior for update from empty dir
184 # avoid silly behavior for update from empty dir
182 if not c1 or not c2 or c1 == c2:
185 if not c1 or not c2 or c1 == c2:
183 return {}, {}
186 return {}, {}, {}
184
187
185 # avoid silly behavior for parent -> working dir
188 # avoid silly behavior for parent -> working dir
186 if c2.node() is None and c1.node() == repo.dirstate.p1():
189 if c2.node() is None and c1.node() == repo.dirstate.p1():
187 return repo.dirstate.copies(), {}
190 return repo.dirstate.copies(), {}, {}
188
191
189 limit = _findlimit(repo, c1.rev(), c2.rev())
192 limit = _findlimit(repo, c1.rev(), c2.rev())
190 if limit is None:
193 if limit is None:
191 # no common ancestor, no copies
194 # no common ancestor, no copies
192 return {}, {}
195 return {}, {}, {}
193 m1 = c1.manifest()
196 m1 = c1.manifest()
194 m2 = c2.manifest()
197 m2 = c2.manifest()
195 ma = ca.manifest()
198 ma = ca.manifest()
@@ -283,10 +286,15 b' def mergecopies(repo, c1, c2, ca):'
283 for f in u2:
286 for f in u2:
284 checkcopies(f, m2, m1)
287 checkcopies(f, m2, m1)
285
288
289 renamedelete = {}
286 diverge2 = set()
290 diverge2 = set()
287 for of, fl in diverge.items():
291 for of, fl in diverge.items():
288 if len(fl) == 1 or of in c1 or of in c2:
292 if len(fl) == 1 or of in c1 or of in c2:
289 del diverge[of] # not actually divergent, or not a rename
293 del diverge[of] # not actually divergent, or not a rename
294 if of not in c1 and of not in c2:
295 # renamed on one side, deleted on the other side, but filter
296 # out files that have been renamed and then deleted
297 renamedelete[of] = [f for f in fl if f in c1 or f in c2]
290 else:
298 else:
291 diverge2.update(fl) # reverse map for below
299 diverge2.update(fl) # reverse map for below
292
300
@@ -302,7 +310,7 b' def mergecopies(repo, c1, c2, ca):'
302 del diverge2
310 del diverge2
303
311
304 if not fullcopy:
312 if not fullcopy:
305 return copy, diverge
313 return copy, diverge, renamedelete
306
314
307 repo.ui.debug(" checking for directory renames\n")
315 repo.ui.debug(" checking for directory renames\n")
308
316
@@ -337,7 +345,7 b' def mergecopies(repo, c1, c2, ca):'
337 del d1, d2, invalid
345 del d1, d2, invalid
338
346
339 if not dirmove:
347 if not dirmove:
340 return copy, diverge
348 return copy, diverge, renamedelete
341
349
342 for d in dirmove:
350 for d in dirmove:
343 repo.ui.debug(" dir %s -> %s\n" % (d, dirmove[d]))
351 repo.ui.debug(" dir %s -> %s\n" % (d, dirmove[d]))
@@ -354,4 +362,4 b' def mergecopies(repo, c1, c2, ca):'
354 repo.ui.debug(" file %s -> %s\n" % (f, copy[f]))
362 repo.ui.debug(" file %s -> %s\n" % (f, copy[f]))
355 break
363 break
356
364
357 return copy, diverge
365 return copy, diverge, renamedelete
@@ -198,9 +198,11 b' def manifestmerge(repo, p1, p2, pa, over'
198 elif pa == p2: # backwards
198 elif pa == p2: # backwards
199 pa = p1.p1()
199 pa = p1.p1()
200 elif pa and repo.ui.configbool("merge", "followcopies", True):
200 elif pa and repo.ui.configbool("merge", "followcopies", True):
201 copy, diverge = copies.mergecopies(repo, p1, p2, pa)
201 copy, diverge, renamedelete = copies.mergecopies(repo, p1, p2, pa)
202 for of, fl in diverge.iteritems():
202 for of, fl in diverge.iteritems():
203 act("divergent renames", "dr", of, fl)
203 act("divergent renames", "dr", of, fl)
204 for of, fl in renamedelete.iteritems():
205 act("rename and delete", "rd", of, fl)
204
206
205 repo.ui.note(_("resolving manifests\n"))
207 repo.ui.note(_("resolving manifests\n"))
206 repo.ui.debug(" overwrite: %s, partial: %s\n"
208 repo.ui.debug(" overwrite: %s, partial: %s\n"
@@ -409,6 +411,12 b' def applyupdates(repo, action, wctx, mct'
409 "multiple times to:\n") % f)
411 "multiple times to:\n") % f)
410 for nf in fl:
412 for nf in fl:
411 repo.ui.warn(" %s\n" % nf)
413 repo.ui.warn(" %s\n" % nf)
414 elif m == "rd": # rename and delete
415 fl = a[2]
416 repo.ui.warn(_("note: possible conflict - %s was deleted "
417 "and renamed to:\n") % f)
418 for nf in fl:
419 repo.ui.warn(" %s\n" % nf)
412 elif m == "e": # exec
420 elif m == "e": # exec
413 flags = a[2]
421 flags = a[2]
414 repo.wopener.audit(f)
422 repo.wopener.audit(f)
@@ -156,3 +156,26 b' Check for issue2089'
156 c2
156 c2
157
157
158 $ cd ..
158 $ cd ..
159
160 Check for issue3074
161
162 $ hg init repo3074
163 $ cd repo3074
164 $ echo foo > file
165 $ hg add file
166 $ hg commit -m "added file"
167 $ hg mv file newfile
168 $ hg commit -m "renamed file"
169 $ hg update 0
170 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
171 $ hg rm file
172 $ hg commit -m "deleted file"
173 created new head
174 $ hg merge
175 note: possible conflict - file was deleted and renamed to:
176 newfile
177 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
178 (branch merge, don't forget to commit)
179 $ hg status
180 M newfile
181 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now