storage:vcs:git: move Git to ExecGit and add PygitGit using pygit2.
authorW. Trevor King <wking@tremily.us>
Thu, 13 Sep 2012 23:07:59 +0000 (19:07 -0400)
committerW. Trevor King <wking@tremily.us>
Thu, 13 Sep 2012 23:07:59 +0000 (19:07 -0400)
commit503951e7f60f24bd30f97f3c7f1b366c6fb30250
treefe8d4b79bdf2aa4352950916dc21d0e73cfefbba
parentf727a1458954320781a311f6f9fe8b8a016b61e4
storage:vcs:git: move Git to ExecGit and add PygitGit using pygit2.

If `pygit2` is installed, use it (via PygitGit) rather than calling
the stand-alone `git` executable for all the Git (via ExecGit) for all
the Git storage stuff.  This saves one serializing/deserializing and
process setup/teardown.  I timed each test suite by commenting out one
of the `make_vcs_testcase_subclasses()` calls at the end of `git.py`
and running

  $ time python test.py libbe.storage.vcs.git

The ExecGit tests ran in 13.7s and the PygitGit tests ran in 3.6s for
a 3.8x speedup.

I had to stretch pygit2 a bit to get a clean fit, so if you want to
test this, you'll need to build pygit2 with the following merge
requests:

  Add 'pygit2.__version__' for easy access from client software.
    https://github.com/libgit2/pygit2/pull/128
    commit 0238fb72dfdf2a2308f2da347717cbaafddc4b83
  signature: Add keyword argument parsing to Signature().
    https://github.com/libgit2/pygit2/pull/129
    commit c934858b629f40221406f34166dd77e881b9d5fd
  repository: add Repository.revparse_single()
    https://github.com/libgit2/pygit2/pull/131
    commit 3afdc8b2f59ed137531671fedde36f3a39cbcc9d
libbe/storage/vcs/git.py