The purpose of this document is to list all of the notable changes to this project. The format was inspired by Keep a Changelog. This project adheres to semantic versioning.

Release 4.2 (2018-04-26)

  • Added this changelog.
  • Added license key to setup script.

Release 4.1.3 (2018-03-28)

Bug fix: Restore support for exporting to directories with relative pathnames.

Release 4.1.2 (2018-03-28)

Bug fix: Make sure update_context() is called before is_bare() is invoked.

Release 4.1.1 (2018-03-08)

Bug fix: Resolve issue #5 by expanding remote git branch names to be unambiguous.

Release 4.1 (2018-03-08)

  • Bug fix: Resolve issue #4 by implementing a new approach to “git branch name discovery” (that works equally well for local branches as it does for remote branches) by switching from git branch --list --verbose to git for-each-ref.
  • Document MacOS compatibility, run MacOS tests on Travis CI. While I never specifically intended for vcs-repo-mgr to be used on Apple systems, a colleague of mine has been trying to do exactly this and has run into a number of issues that are probably caused by platform incompatibilities in vcs-repo-mgr and/or its dependencies.

Release 4.0 (2018-03-05)

  • Backwards incompatible: Force internal merge tool for Mercurial. After isolating the test suite from $HOME my ~/.hgrc was ignored and the following setting disappeared:

    merge = internal:merge

    Then I ran the vcs-repo-mgr test suite and meld popped up. Not what I was expecting from an automated test suite! Although it seems unlikely to me that someone would depend on the old behavior the introduction of hg --config ui.merge=internal:merge is backwards incompatible and version numbers are cheap, so I’m bumping the major version number :-).

    I do think the new behavior is a better default for the Mercurial backend given the focus of vcs-repo-mgr on automation, if only to make this backend match the behavior of the other backends.

  • Isolate the test suite from $HOME. I recently added the following to my ~/.gitconfig:

    gpgsign = true

    Then I ran the vcs-repo-mgr test suite and I was not amused :-P. This should fix the underlying more generic issue.

Release 3.0 (2018-03-05)

  • Backwards incompatible: Raise an exception when a working tree is required but missing. This change is technically backwards incompatible in more than one way:

    1. Requiring subclasses to implement the supports_working_tree property breaks external subclasses (outside of my control).
    2. The new exception previously wasn’t there and would never be raised, but then all of the affected operations (requiring a working tree) would likely end in an external command failure.

    For what it’s worth: I don’t expect these changes to bite any real life use cases.

  • Merged pull request #3 to improve MacOS compatibility (by replacing mkdir --parents with mkdir -p).

  • Starting from this release the files needed to generate documentation are included in source distributions.

  • Moved the coerce_pattern() function to the humanfriendly package (because I wanted to be able to use it in qpass as well).

Release 2.0.1 (2017-08-02)

Bug fix: Ignore untracked files in HgRepo.commit().

Release 2.0 (2017-07-14)

Various changes to merge_up():

  • Automatically create release branches.
  • Skip merging up when target branch is default branch.
  • Bug fix: Don’t delete or close non-feature-branches.

Release 1.0 (2017-07-03)

Major rewrite: Named remotes, selective pushing, init support, etc.

Brain dump of changes:

  • What triggered me to start on a major rewrite was that I’d gotten fed up with the current (horrible) test suite because it depends on the cloning of remote public repositories which makes it slow and fragile. To underline why it is fragile:

    I only know of one place to find public Bazaar repositories which is, however cloning a Bazaar repository from Launchpad fails more often than it works. Recently the ‘more often’ turned into always and the test coverage of the Bazaar support in vcs-repo-mgr basically disappeared, without any action from me :-(.

    To improve the test suite I wanted to add support for bzr init, git init and hg init. However that would have made the code even uglier than it already was and so the rewrite was triggered :-).

    Support for init has been added, by the way :-P. I’ve also added support for creating tags, otherwise I wouldn’t have been able to test the support for tags :-).

    After the rewrite I also rewrote the test suite, it’s a completely different beast now. Stil slow, but much more robust and with quicker feedback about individual tests.

  • The push() and pull() methods can work with specific revisions and merge_up() has been changed to pull a specific revision (the feature branch that it merges in).

  • The API between the Repository superclass and the subclasses that implement support for a specific version control system has been changed completely, in various backwards incompatible ways.

  • The new API enables introspection of ‘remotes’ (the repositories from which you clone/pull and the repositories that you push to) which enables pull() to know whether a ‘default remote’ is configured for any given repository.

  • The new API has a class to represent commit authors, enabling less ad-hoc communication between the superclass, its subclasses and callers.

  • In the process of rewriting everything I’ve switched to using execution contexts created by executor.contexts, this enables me to configure the working directory in two places instead of having to repeat the same thing in a hundred different places. This change also gives callers much more control over how external commands are executed (so much control that you can in theory run the commands on a remote system over SSH without having a version control system installed on your local system :-P).

  • Support for specific version control systems has been extracted from the main vcs_repo_mgr module into separate modules under the vcs_repo_mgr.backends namespace. The modules in the backends namespace are loaded on demand.

Release 0.34 (2017-04-29)

  • Improved the command line interface.
  • Added Python 3.6 to tested Python versions.
  • Refactored makefile (and Travis CI and Tox configs).

Release 0.33.1 (2016-11-30)

Update stdeb.cfg from (to avoid duplicate dependencies).

Release 0.33 (2016-10-26)

  • Support for pushing between repositories.
  • Started publishing wheel distributions.
  • Improved documentation on raised exceptions.
  • Improved logging in Repository.update().
  • Droped support for PyPy (refer to readme changes for details).

Release 0.32.1 (2016-08-04)

  • Refactor setup script to fix issue #2 (UnicodeDecodeError in on Python 3).
  • Run test suite on Travis CI under PyPy as well (works for me with tox :-)

Release 0.32 (2016-04-20)

Enable feature branch customization for merge_up().

Release 0.31 (2016-04-20)

Support for interactive merge conflict resolution.

Release 0.30 (2016-03-18)

Added a command line interface for the merge_up() functionality.

Release 0.29 (2016-03-18)

Make it possible to merge changes up through release branches.

Release 0.28 (2016-03-18)

Make it possible to add new files to repositories.

Release 0.27.2 (2016-03-18)

Bug fix for previous commit (concerning the hg remove --after return code).

Release 0.27.1 (2016-03-18)

Run hg remove --after before hg commit.

Release 0.27 (2016-03-16)

Expose the name of the currently checked out branch.

Release 0.26.1 (2016-03-16)

Bug fix for hg command invocations, refer to the following Travis CI build failure for details:

Release 0.26 (2016-03-16)

Make it possible to delete merged branches.

Release 0.25 (2016-03-16)

  • Automatic Repository subclass registration using metaclasses.
  • Move aliases from repository_factory() to Repository subclasses.
  • Transform the vcs_directory and exists properties into static methods.
  • Make repository_factory() a bit more flexible.
  • Make coerce_repository() infer VCS types from local directories

Release 0.24.1 (2016-03-16)

Bug fix for unattended git merge support.

Release 0.24 (2016-03-16)

Make it possible to merge between branches.

Release 0.23.1 (2016-03-16)

Switch from git diff to git diff HEAD (see the inline documentation for more details).

Release 0.23 (2016-03-16)

Make it possible to create new branches.

Release 0.22.3 (2016-03-16)

  • Start using the @lazy_property decorator.
  • Bug fix for git commit message author handling.
  • Stop Travis CI from launching builds for tags.

Release 0.22.2 (2016-03-16)

A bug fix for the test suite.

Release 0.22.1 (2016-03-16)

Improve handling of commit authors.

The general idea behind the new implementation is to reconcile two opposing forces:

  • Don’t rely on configuration files (I’m building a Python API after all).
  • Respect the values in configuration files when available (because of the Do What I Mean aspect).

Release 0.22 (2016-03-16)

  • Make it possible to commit changes.
  • Add Python 3.5 to supported versions.

Release 0.21 (2016-03-16)

Make it possible to override the remote for create() and update() calls.

Release 0.20.1 (2016-03-16)

Fixed a Python 3 incompatibility in the test suite.

Release 0.20 (2016-03-16)

Enable updating of the working tree to different revisions.

Release 0.19 (2016-03-16)

  • Start switching to property-manager.
  • Force Read the Docs to install with pip instead of python install.

Release 0.18.2 (2016-03-15)

Enable bare=None in find_configured_repository().

Release 0.18.1 (2016-03-15)

  • Make preference for (non-)bare repositories more flexible.
  • Give readme & documentation some much needed love.

Release 0.18 (2016-03-15)

Make it possible to check whether a working tree is clean.

Release 0.17 (2016-03-15)

Enable clones with working trees (non-bare clones).

Release 0.16 (2016-03-15)

  • Make it possible to check for bare checkouts
  • Document existing CONSTANTS, make known_release_schemes a documented constant as well.
  • Implement and enforce PEP-8 and PEP-257 compliance.

Release 0.15.1 (2015-08-19)

Bug fix: Make sure git fetch always updates local branches.

To be honest I’m not sure why I never ran into this before, I’ve been using this functionality for months and updates always came in just fine based on the same version of git. Nevertheless the new git fetch command is the proper, documented way to do what I want git to do so here we go :-).

Detailed explanation:

Release 0.15 (2015-06-25)

  • Expand ~/ and $HOME in configuration file (issue #1).
  • Improve documentation of find_configured_repository().
  • Improve documentation on how limit_vcs_updates works.

Release 0.14 (2015-05-08)

  • Move exceptions to separate module.
  • Various documentation improvements.

Release 0.13 (2015-05-08)

Shortcuts to translate release identifiers to branches/tags (also got test coverage back up to +/- 97%).

Release 0.12 (2015-03-16)

Expose release specific functionality in CLI (listing & selection).

Release 0.11 (2015-03-16)

  • Expose release selection in CLI (similar to revision selection).
  • Fix RST format typo in find_configured_repository() docstring.

Release 0.10 (2015-02-19)

  • Don’t construct duplicate Repository objects (when possible to avoid).
  • Improve argument validation in Repository initializer.
  • Move autovivification of local clones to Repository initializer.
  • make install should install ‘dynamic dependencies’ as well.

Release 0.9 (2015-02-19)

Changed release querying API, added “release selection” API.

Release 0.8 (2015-02-19)

Experimental support for “releases” (can be based on tags or branches).

Release 0.7 (2014-11-02)

Auto vivification of VCS repositories.

Release 0.6.4 (2014-09-14)

Support for generating Debian control file Vcs-* fields.

Release 0.6.3 (2014-09-14)

Another bug fix for Python 3.x compatibility in test suite.

Release 0.6.2 (2014-09-14)

Bug fix to make test suite compatible with Python 3.x. See

Release 0.6.1 (2014-09-14)

Support for summing revision numbers from multiple repositories.

Release 0.6 (2014-09-14)

Support for Bazaar repositories.

Release 0.5 (2014-09-14)

Support for tags (also rewrote the test suite and increased test coverage).

Release 0.4 (2014-06-25)

Rename limit_repo_updates to limit_vcs_updates (backwards incompatible).

Release 0.3.2 (2014-06-22)

Try to unbreak Python 3.x tests on Travis CI.

Release 0.3.1 (2014-06-22)

Bug fix for ‘rate limiting’ of repository updates.

Release 0.3 (2014-06-19)

Support ‘rate limiting’ of repository updates.

Release 0.2.4 (2014-05-31)

  • Change Mercurial from Debian dependency to Python dependency.
  • Improve test coverage by testing command line interface.

Release 0.2.3 (2014-05-11)

  • Automatically create local repositories on the first run.
  • Bump humanfriendly requirement due to Python 3 compatibility.

Release 0.2.2 (2014-05-11)

Removed dead code and increased test coverage.

Release 0.2.1 (2014-05-10)

  • Bug fix for Revision.revision_number.
  • Improved test coverage, started using

Release 0.2 (2014-05-10)

  • Document supported Python versions (2.6, 2.7 & 3.4).
  • Switch git clone in tests to use HTTPS instead of SSH
  • Start using Travis CI.

Release 0.1.5 (2014-05-05)

Bug fix: Include stdeb.cfg in source distributions (via

Release 0.1.4 (2014-05-05)

  • Document the dependency on git and hg executables.
  • Document dependencies on Debian system packages in stdeb.cfg.

Release 0.1.3 (2014-05-04)

Add the usage message of the vcs-tool program to the documentation.

Release 0.1.2 (2014-05-04)

Added support for vcs-tool --find-directory option.

Release 0.1.1 (2014-05-04)

Bug fix: Added missing humanfriendly dependency.

Release 0.1 (2014-05-04)

The initial commit with support for cloning repositories, pulling updates, exporting revisions, querying revision ids and numbers for Git and Mercurial repositories.