contrib/compress.py
author Wagner Bruna <wbruna@softwareexpress.com.br>
Fri, 13 Aug 2010 13:11:41 -0300
changeset 11944 df52ff0980fe
parent 11933 293afcfb66a8
child 12015 73940fe84cbf
permissions -rw-r--r--
revset: predicate to avoid lookup errors A query like head() and (descendants("bad") and not descendants("fix")) (testing if repo heads are affected by a bug) will abort with a RepoLookupError if either badrev or fixrev aren't found inside the repository, which is not very informative. The new predicate returns an empty set for lookup errors, so head() and (descendants(present("bad")) and not descendants(present("fix"))) will behave as wanted even if those revisions are not found.

# Copyright 2010 Pradeepkumar Gayam <in3xes@gmail.com>
#
# Author(s):
# Pradeepkumar Gayam <in3xes@gmail.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.


from mercurial import hg, ui, transaction, util, changegroup, localrepo, merge
import sys, os

def compress(ui, repo, dest, **opts):
    dest = os.path.realpath(util.expandpath(dest))
    target = localrepo.instance(ui, dest, create=1)
    tr = transaction.transaction(sys.stderr.write,
                                 util.opener('.', False), "compress")
    src_cl = repo.changelog
    tar_cl = target.changelog
    changedfiles = set()
    mmfs = {}
    collect = changegroup.collector(src_cl, mmfs, changedfiles)
    total = len(repo)
    opener = target.sopener

    for r in src_cl:
        p = [src_cl.node(i) for i in src_cl.parentrevs(r)]
        nd = tar_cl.addrevision(src_cl.revision(src_cl.node(r)), tr,
                                 src_cl.linkrev(r), p[0], p[1])
        collect(nd)
        ui.progress(('adding changesets'), r, unit=('revisions'),
                    total=total)

    src_mnfst = repo.manifest
    tar_mnfst = target.manifest
    for r in src_mnfst:
        p = [src_mnfst.node(i) for i in src_mnfst.parentrevs(r)]
        tar_mnfst.addrevision(src_mnfst.revision(src_mnfst.node(r)), tr,
                               src_mnfst.linkrev(r), p[0], p[1])
        ui.progress(('adding manifest'), r, unit=('revisions'),
                    total=total)

    total = len(changedfiles)
    for cnt, f in enumerate(changedfiles):
        sf = repo.file(f)
        tf = target.file(f)
        for r in sf:
            p = [sf.node(i) for i in sf.parentrevs(r)]
            a = tf.addrevision(sf.revision(sf.node(r)), tr, sf.linkrev(r),
                               p[0], p[1])
        ui.progress(('adding files'), cnt, item=f, unit=('file'), total=total)

    tr.close()

cmdtable = {
    "compress" : (compress, [], "DEST")
    }