comparison mercurial/localrepo.py @ 1716:ef8cd889a78b

Refactor excessive merge detection, add test
author Matt Mackall <mpm@selenic.com>
date Fri, 17 Feb 2006 17:23:53 -0600
parents 03ee100b8c21
children 2c9872a4f3fd
comparison
equal deleted inserted replaced
1715:40346aa66b0f 1716:ef8cd889a78b
266 self.ui.warn(_("waiting for lock held by %s\n") % inst.args[0]) 266 self.ui.warn(_("waiting for lock held by %s\n") % inst.args[0])
267 wlock = lock.lock(self.join("wlock"), wait, self.dirstate.write) 267 wlock = lock.lock(self.join("wlock"), wait, self.dirstate.write)
268 self.dirstate.read() 268 self.dirstate.read()
269 return wlock 269 return wlock
270 270
271 def checkfilemerge(self, filename, text, filelog, manifest1, manifest2):
272 "determine whether a new filenode is needed"
273 fp1 = manifest1.get(filename, nullid)
274 fp2 = manifest2.get(filename, nullid)
275
276 if fp2 != nullid:
277 # is one parent an ancestor of the other?
278 fpa = filelog.ancestor(fp1, fp2)
279 if fpa == fp1:
280 fp1, fp2 = fp2, nullid
281 elif fpa == fp2:
282 fp2 = nullid
283
284 # is the file unmodified from the parent? report existing entry
285 if fp2 == nullid and text == filelog.read(fp1):
286 return (fp1, None, None)
287
288 return (None, fp1, fp2)
289
271 def rawcommit(self, files, text, user, date, p1=None, p2=None, wlock=None): 290 def rawcommit(self, files, text, user, date, p1=None, p2=None, wlock=None):
272 orig_parent = self.dirstate.parents()[0] or nullid 291 orig_parent = self.dirstate.parents()[0] or nullid
273 p1 = p1 or self.dirstate.parents()[0] or nullid 292 p1 = p1 or self.dirstate.parents()[0] or nullid
274 p2 = p2 or self.dirstate.parents()[1] or nullid 293 p2 = p2 or self.dirstate.parents()[1] or nullid
275 c1 = self.changelog.read(p1) 294 c1 = self.changelog.read(p1)
296 t = self.wread(f) 315 t = self.wread(f)
297 tm = util.is_exec(self.wjoin(f), mfm.get(f, False)) 316 tm = util.is_exec(self.wjoin(f), mfm.get(f, False))
298 r = self.file(f) 317 r = self.file(f)
299 mfm[f] = tm 318 mfm[f] = tm
300 319
301 fp1 = m1.get(f, nullid) 320 (entry, fp1, fp2) = self.checkfilemerge(f, t, r, m1, m2)
302 fp2 = m2.get(f, nullid) 321 if entry:
303 322 mm[f] = entry
304 # is the same revision on two branches of a merge? 323 continue
305 if fp2 == fp1:
306 fp2 = nullid
307
308 if fp2 != nullid:
309 # is one parent an ancestor of the other?
310 fpa = r.ancestor(fp1, fp2)
311 if fpa == fp1:
312 fp1, fp2 = fp2, nullid
313 elif fpa == fp2:
314 fp2 = nullid
315
316 # is the file unmodified from the parent?
317 if t == r.read(fp1):
318 # record the proper existing parent in manifest
319 # no need to add a revision
320 mm[f] = fp1
321 continue
322 324
323 mm[f] = r.add(t, {}, tr, linkrev, fp1, fp2) 325 mm[f] = r.add(t, {}, tr, linkrev, fp1, fp2)
324 changed.append(f) 326 changed.append(f)
325 if update_dirstate: 327 if update_dirstate:
326 self.dirstate.update([f], "n") 328 self.dirstate.update([f], "n")
401 meta["copy"] = cp 403 meta["copy"] = cp
402 meta["copyrev"] = hex(m1.get(cp, m2.get(cp, nullid))) 404 meta["copyrev"] = hex(m1.get(cp, m2.get(cp, nullid)))
403 self.ui.debug(_(" %s: copy %s:%s\n") % (f, cp, meta["copyrev"])) 405 self.ui.debug(_(" %s: copy %s:%s\n") % (f, cp, meta["copyrev"]))
404 fp1, fp2 = nullid, nullid 406 fp1, fp2 = nullid, nullid
405 else: 407 else:
406 fp1 = m1.get(f, nullid) 408 entry, fp1, fp2 = self.checkfilemerge(f, t, r, m1, m2)
407 fp2 = m2.get(f, nullid) 409 if entry:
408 410 new[f] = entry
409 if fp2 != nullid:
410 # is one parent an ancestor of the other?
411 fpa = r.ancestor(fp1, fp2)
412 if fpa == fp1:
413 fp1, fp2 = fp2, nullid
414 elif fpa == fp2:
415 fp2 = nullid
416
417 # is the file unmodified from the parent?
418 if not meta and t == r.read(fp1) and fp2 == nullid:
419 # record the proper existing parent in manifest
420 # no need to add a revision
421 new[f] = fp1
422 continue 411 continue
423 412
424 new[f] = r.add(t, meta, tr, linkrev, fp1, fp2) 413 new[f] = r.add(t, meta, tr, linkrev, fp1, fp2)
425 # remember what we've added so that we can later calculate 414 # remember what we've added so that we can later calculate
426 # the files to pull from a set of changesets 415 # the files to pull from a set of changesets