Mercurial > hg > mercurial-crew-with-dirclash
comparison mercurial/localrepo.py @ 3619:7d3d603e7df9
localrepo: factor commit and rawcommit
note: rawcommit with an empty text will now launch the editor
author | Benoit Boissinot <benoit.boissinot@ens-lyon.org> |
---|---|
date | Tue, 07 Nov 2006 21:43:19 +0100 |
parents | 5be434785317 |
children | 44247ecc2965 |
comparison
equal
deleted
inserted
replaced
3618:5be434785317 | 3619:7d3d603e7df9 |
---|---|
572 | 572 |
573 changelist.append(fn) | 573 changelist.append(fn) |
574 return fl.add(t, meta, transaction, linkrev, fp1, fp2) | 574 return fl.add(t, meta, transaction, linkrev, fp1, fp2) |
575 | 575 |
576 def rawcommit(self, files, text, user, date, p1=None, p2=None, wlock=None): | 576 def rawcommit(self, files, text, user, date, p1=None, p2=None, wlock=None): |
577 orig_parent = self.dirstate.parents()[0] or nullid | 577 if p1 is None: |
578 p1 = p1 or self.dirstate.parents()[0] or nullid | 578 p1, p2 = self.dirstate.parents() |
579 p2 = p2 or self.dirstate.parents()[1] or nullid | 579 return self.commit(files=files, text=text, user=user, date=date, |
580 p1=p1, p2=p2, wlock=wlock) | |
581 | |
582 def commit(self, files=None, text="", user=None, date=None, | |
583 match=util.always, force=False, lock=None, wlock=None, | |
584 force_editor=False, p1=None, p2=None): | |
585 | |
586 commit = [] | |
587 remove = [] | |
588 changed = [] | |
589 use_dirstate = (p1 is None) # not rawcommit | |
590 | |
591 if use_dirstate: | |
592 if files: | |
593 for f in files: | |
594 s = self.dirstate.state(f) | |
595 if s in 'nmai': | |
596 commit.append(f) | |
597 elif s == 'r': | |
598 remove.append(f) | |
599 else: | |
600 self.ui.warn(_("%s not tracked!\n") % f) | |
601 else: | |
602 changes = self.status(match=match)[:5] | |
603 modified, added, removed, deleted, unknown = changes | |
604 commit = modified + added | |
605 remove = removed | |
606 else: | |
607 commit = files | |
608 | |
609 if use_dirstate: | |
610 p1, p2 = self.dirstate.parents() | |
611 update_dirstate = True | |
612 else: | |
613 p1, p2 = p1, p2 or nullid | |
614 update_dirstate = (self.dirstate.parents()[0] == p1) | |
615 | |
580 c1 = self.changelog.read(p1) | 616 c1 = self.changelog.read(p1) |
581 c2 = self.changelog.read(p2) | 617 c2 = self.changelog.read(p2) |
582 m1 = self.manifest.read(c1[0]).copy() | 618 m1 = self.manifest.read(c1[0]).copy() |
583 m2 = self.manifest.read(c2[0]) | 619 m2 = self.manifest.read(c2[0]) |
584 changed = [] | 620 |
585 removed = [] | 621 if use_dirstate: |
586 | 622 branchname = self.workingctx().branch() |
587 if orig_parent == p1: | |
588 update_dirstate = 1 | |
589 else: | 623 else: |
590 update_dirstate = 0 | 624 branchname = "" |
591 | 625 |
592 if not wlock: | 626 if use_dirstate: |
593 wlock = self.wlock() | 627 oldname = c1[5].get("branch", "") |
594 l = self.lock() | 628 if not commit and not remove and not force and p2 == nullid and \ |
595 tr = self.transaction() | 629 branchname == oldname: |
596 linkrev = self.changelog.count() | 630 self.ui.status(_("nothing changed\n")) |
597 for f in files: | 631 return None |
598 try: | |
599 m1[f] = self.filecommit(f, m1, m2, linkrev, tr, changed) | |
600 m1.set(f, util.is_exec(self.wjoin(f), m1.execf(f))) | |
601 except IOError: | |
602 try: | |
603 del m1[f] | |
604 if update_dirstate: | |
605 self.dirstate.forget([f]) | |
606 removed.append(f) | |
607 except: | |
608 # deleted from p2? | |
609 pass | |
610 | |
611 mnode = self.manifest.add(m1, tr, linkrev, c1[0], c2[0]) | |
612 user = user or self.ui.username() | |
613 n = self.changelog.add(mnode, changed + removed, text, | |
614 tr, p1, p2, user, date) | |
615 tr.close() | |
616 if update_dirstate: | |
617 self.dirstate.setparents(n, nullid) | |
618 | |
619 def commit(self, files=None, text="", user=None, date=None, | |
620 match=util.always, force=False, lock=None, wlock=None, | |
621 force_editor=False): | |
622 commit = [] | |
623 remove = [] | |
624 changed = [] | |
625 | |
626 if files: | |
627 for f in files: | |
628 s = self.dirstate.state(f) | |
629 if s in 'nmai': | |
630 commit.append(f) | |
631 elif s == 'r': | |
632 remove.append(f) | |
633 else: | |
634 self.ui.warn(_("%s not tracked!\n") % f) | |
635 else: | |
636 modified, added, removed, deleted, unknown = self.status(match=match)[:5] | |
637 commit = modified + added | |
638 remove = removed | |
639 | |
640 p1, p2 = self.dirstate.parents() | |
641 c1 = self.changelog.read(p1) | |
642 c2 = self.changelog.read(p2) | |
643 m1 = self.manifest.read(c1[0]).copy() | |
644 m2 = self.manifest.read(c2[0]) | |
645 | |
646 branchname = self.workingctx().branch() | |
647 oldname = c1[5].get("branch", "") | |
648 | |
649 if not commit and not remove and not force and p2 == nullid and \ | |
650 branchname == oldname: | |
651 self.ui.status(_("nothing changed\n")) | |
652 return None | |
653 | 632 |
654 xp1 = hex(p1) | 633 xp1 = hex(p1) |
655 if p2 == nullid: xp2 = '' | 634 if p2 == nullid: xp2 = '' |
656 else: xp2 = hex(p2) | 635 else: xp2 = hex(p2) |
657 | 636 |
672 try: | 651 try: |
673 m1[f] = self.filecommit(f, m1, m2, linkrev, tr, changed) | 652 m1[f] = self.filecommit(f, m1, m2, linkrev, tr, changed) |
674 m1.set(f, util.is_exec(self.wjoin(f), m1.execf(f))) | 653 m1.set(f, util.is_exec(self.wjoin(f), m1.execf(f))) |
675 new.append(f) | 654 new.append(f) |
676 except IOError: | 655 except IOError: |
677 self.ui.warn(_("trouble committing %s!\n") % f) | 656 if use_dirstate: |
678 raise | 657 self.ui.warn(_("trouble committing %s!\n") % f) |
658 raise | |
659 else: | |
660 remove.append(f) | |
679 | 661 |
680 # update manifest | 662 # update manifest |
681 remove.sort() | 663 remove.sort() |
682 | 664 |
683 for f in remove: | 665 for f in remove: |
718 user, date, extra) | 700 user, date, extra) |
719 self.hook('pretxncommit', throw=True, node=hex(n), parent1=xp1, | 701 self.hook('pretxncommit', throw=True, node=hex(n), parent1=xp1, |
720 parent2=xp2) | 702 parent2=xp2) |
721 tr.close() | 703 tr.close() |
722 | 704 |
723 self.dirstate.setparents(n) | 705 if use_dirstate or update_dirstate: |
724 self.dirstate.update(new, "n") | 706 self.dirstate.setparents(n) |
725 self.dirstate.forget(remove) | 707 if use_dirstate: |
708 self.dirstate.update(new, "n") | |
709 self.dirstate.forget(remove) | |
726 | 710 |
727 self.hook("commit", node=hex(n), parent1=xp1, parent2=xp2) | 711 self.hook("commit", node=hex(n), parent1=xp1, parent2=xp2) |
728 return n | 712 return n |
729 | 713 |
730 def walk(self, node=None, files=[], match=util.always, badmatch=None): | 714 def walk(self, node=None, files=[], match=util.always, badmatch=None): |