view hgrepo.py @ 167:cb5beb432e78

nicer and more descriptive comment
author Scott Chacon <schacon@gmail.com>
date Mon, 01 Jun 2009 15:15:43 -0700
parents 405a915bf352
children 8bfa8aa6b68f
line wrap: on
line source

from mercurial import localrepo, lock, node
from mercurial import changelog, dirstate, filelog, manifest, context, weakref
from mercurial.node import bin, hex, nullid, nullrev, short

class hgrepo(localrepo.localrepository):

    def commitctx(self, wctx, ancestor, force_files = False):
    
        tr = None
        valid = 0 # don't save the dirstate if this isn't set
        try:
            force=False
            force_editor=False
            empty_ok=False
            use_dirstate=False
            update_dirstate=False
            
            commit = sorted(wctx.modified() + wctx.added())
            remove = wctx.removed()
            extra = wctx.extra().copy()
            branchname = extra['branch']
            user = wctx.user()
            text = wctx.description()

            p1, p2 = [p.node() for p in wctx.parents()]
            c1 = self.changelog.read(p1)
            c2 = self.changelog.read(p2)
            m1 = self.manifest.read(c1[0]).copy()
            m2 = self.manifest.read(c2[0])
            ma = None
            if ancestor:
                ma = ancestor.manifest()

            xp1 = hex(p1)
            if p2 == nullid: xp2 = ''
            else: xp2 = hex(p2)

            tr = self.transaction()
            trp = weakref.proxy(tr)

            # looking for files that have not actually changed content-wise,
            # but have different nodeids because they were changed and then
            # reverted, so they have changed in the revlog.
            for f in m1:
                if (f in m2) and (not f in commit) and (not m1[f] == m2[f]):
                    commit.append(f)
                    
            # check in files
            new = {}
            changed = []
            linkrev = len(self)
            for f in commit:
                self.ui.note(f + "\n")
                try:
                    fctx = wctx.filectx(f)
                    newflags = fctx.flags()
                    new[f] = self.filecommit(fctx, m1, m2, linkrev, trp, changed)
                    if ((not changed or changed[-1] != f) and
                        m2.get(f) != new[f]):
                        # mention the file in the changelog if some
                        # flag changed, even if there was no content
                        # change.
                        if m1.flags(f) != newflags:
                            changed.append(f)
                    m1.set(f, newflags)

                except (OSError, IOError):
                    remove.append(f)
            
            updated, added = [], []
            for f in sorted(changed):
                if f in m1 or f in m2:
                    updated.append(f)
                else:
                    added.append(f)
            
            # update manifest
            m1.update(new)
            removed = [f for f in sorted(remove) if f in m1 or f in m2]
            removed1 = []

            for f in removed:
                if f in m1:
                    del m1[f]
                    removed1.append(f)
                else:
                    if ma and (f in ma):
                        del ma[f]
                        removed.remove(f)
            
            mn = self.manifest.add(m1, trp, linkrev, c1[0], c2[0],
                                   (new, removed1))

            lines = [line.rstrip() for line in text.rstrip().splitlines()]
            while lines and not lines[0]:
                del lines[0]
            if not lines and use_dirstate:
                raise util.Abort(_("empty commit message"))
            text = '\n'.join(lines)

            file_list = []
            if len(force_files) > 0:
                file_list = force_files
            else:
                file_list = changed + removed
            
            self.changelog.delayupdate()
            n = self.changelog.add(mn, file_list, text, trp, p1, p2,
                                   user, wctx.date(), extra)
            p = lambda: self.changelog.writepending() and self.root or ""
            self.hook('pretxncommit', throw=True, node=hex(n), parent1=xp1,
                      parent2=xp2, pending=p)
            self.changelog.finalize(trp)
            tr.close()
            
            if self.branchcache:
                self.branchtags()

            if update_dirstate:
                self.dirstate.setparents(n)
            valid = 1 # our dirstate updates are complete

            self.hook("commit", node=hex(n), parent1=xp1, parent2=xp2)
            return n
        finally:
            if not valid: # don't save our updated dirstate
                self.dirstate.invalidate()
            del tr


instance = hgrepo