460 return self.do_lock("wlock", wait, self.dirstate.write, |
460 return self.do_lock("wlock", wait, self.dirstate.write, |
461 self.wreload, |
461 self.wreload, |
462 desc=_('working directory of %s') % self.origroot) |
462 desc=_('working directory of %s') % self.origroot) |
463 |
463 |
464 def checkfilemerge(self, filename, text, filelog, manifest1, manifest2): |
464 def checkfilemerge(self, filename, text, filelog, manifest1, manifest2): |
465 "determine whether a new filenode is needed" |
465 """ |
|
466 Determine whether a new filenode is needed and what parent |
|
467 and rename information is needed for a file commit. |
|
468 |
|
469 Returns (old entry, file parent 1, file parent 2, metadata) |
|
470 |
|
471 If old entry is not None, a commit is not needed. |
|
472 """ |
466 fp1 = manifest1.get(filename, nullid) |
473 fp1 = manifest1.get(filename, nullid) |
467 fp2 = manifest2.get(filename, nullid) |
474 fp2 = manifest2.get(filename, nullid) |
468 |
475 |
469 if fp2 != nullid: |
476 meta = {} |
|
477 cp = self.dirstate.copied(filename) |
|
478 if cp: |
|
479 meta["copy"] = cp |
|
480 if not manifest2: # not a branch merge |
|
481 meta["copyrev"] = hex(manifest1.get(cp, nullid)) |
|
482 fp2 = nullid |
|
483 elif fp2 != nullid: # copied on remote side |
|
484 meta["copyrev"] = hex(manifest1.get(cp, nullid)) |
|
485 else: # copied on local side, reversed |
|
486 meta["copyrev"] = hex(manifest2.get(cp)) |
|
487 fp2 = nullid |
|
488 self.ui.debug(_(" %s: copy %s:%s\n") % |
|
489 (filename, cp, meta["copyrev"])) |
|
490 fp1 = nullid |
|
491 elif fp2 != nullid: |
470 # is one parent an ancestor of the other? |
492 # is one parent an ancestor of the other? |
471 fpa = filelog.ancestor(fp1, fp2) |
493 fpa = filelog.ancestor(fp1, fp2) |
472 if fpa == fp1: |
494 if fpa == fp1: |
473 fp1, fp2 = fp2, nullid |
495 fp1, fp2 = fp2, nullid |
474 elif fpa == fp2: |
496 elif fpa == fp2: |
475 fp2 = nullid |
497 fp2 = nullid |
476 |
498 |
477 # is the file unmodified from the parent? report existing entry |
499 # is the file unmodified from the parent? report existing entry |
|
500 # fixme: use filelog.cmp() |
478 if fp2 == nullid and text == filelog.read(fp1): |
501 if fp2 == nullid and text == filelog.read(fp1): |
479 return (fp1, None, None) |
502 return (fp1, None, None, {}) |
480 |
503 |
481 return (None, fp1, fp2) |
504 return (None, fp1, fp2, meta) |
482 |
505 |
483 def rawcommit(self, files, text, user, date, p1=None, p2=None, wlock=None): |
506 def rawcommit(self, files, text, user, date, p1=None, p2=None, wlock=None): |
484 orig_parent = self.dirstate.parents()[0] or nullid |
507 orig_parent = self.dirstate.parents()[0] or nullid |
485 p1 = p1 or self.dirstate.parents()[0] or nullid |
508 p1 = p1 or self.dirstate.parents()[0] or nullid |
486 p2 = p2 or self.dirstate.parents()[1] or nullid |
509 p2 = p2 or self.dirstate.parents()[1] or nullid |
504 try: |
527 try: |
505 t = self.wread(f) |
528 t = self.wread(f) |
506 m1.set(f, util.is_exec(self.wjoin(f), m1.execf(f))) |
529 m1.set(f, util.is_exec(self.wjoin(f), m1.execf(f))) |
507 r = self.file(f) |
530 r = self.file(f) |
508 |
531 |
509 (entry, fp1, fp2) = self.checkfilemerge(f, t, r, m1, m2) |
532 entry, fp1, fp2, meta = self.checkfilemerge(f, t, r, m1, m2) |
510 if entry: |
533 if entry: |
511 m1[f] = entry |
534 m1[f] = entry |
512 continue |
535 continue |
513 |
536 |
514 m1[f] = r.add(t, {}, tr, linkrev, fp1, fp2) |
537 m1[f] = r.add(t, meta, tr, linkrev, fp1, fp2) |
515 changed.append(f) |
538 changed.append(f) |
516 if update_dirstate: |
539 if update_dirstate: |
517 self.dirstate.update([f], "n") |
540 self.dirstate.update([f], "n") |
518 except IOError: |
541 except IOError: |
519 try: |
542 try: |
587 self.ui.warn(_("trouble committing %s!\n") % f) |
610 self.ui.warn(_("trouble committing %s!\n") % f) |
588 raise |
611 raise |
589 |
612 |
590 r = self.file(f) |
613 r = self.file(f) |
591 |
614 |
592 meta = {} |
615 entry, fp1, fp2, meta = self.checkfilemerge(f, t, r, m1, m2) |
593 cp = self.dirstate.copied(f) |
616 if entry: |
594 if cp: |
617 new[f] = entry |
595 meta["copy"] = cp |
618 continue |
596 meta["copyrev"] = hex(m1.get(cp, m2.get(cp, nullid))) |
|
597 self.ui.debug(_(" %s: copy %s:%s\n") % (f, cp, meta["copyrev"])) |
|
598 fp1, fp2 = nullid, nullid |
|
599 else: |
|
600 entry, fp1, fp2 = self.checkfilemerge(f, t, r, m1, m2) |
|
601 if entry: |
|
602 new[f] = entry |
|
603 continue |
|
604 |
619 |
605 new[f] = r.add(t, meta, tr, linkrev, fp1, fp2) |
620 new[f] = r.add(t, meta, tr, linkrev, fp1, fp2) |
606 # remember what we've added so that we can later calculate |
621 # remember what we've added so that we can later calculate |
607 # the files to pull from a set of changesets |
622 # the files to pull from a set of changesets |
608 changed.append(f) |
623 changed.append(f) |