libvcs¶
libvcs provides a unified, typed, and pythonic interface for managing Git, Mercurial, and Subversion repositories. Whether you’re building a deployment tool, a developer utility, or just need to clone a repo in a script, libvcs handles the heavy lifting.
It powers vcspull and simplifies VCS interactions down to a few lines of code.
Features at a Glance¶
🔄 Repository Synchronization: Clone, update, and manage local repository copies with a high-level API.
🛠 Command Abstraction: Speak fluent
git,hg, andsvnthrough fully-typed Python objects.🔗 URL Parsing: Robustly validate, parse, and manipulate VCS URLs (including SCP-style).
🧪 Pytest Fixtures: Batteries-included fixtures for spinning up temporary repositories in your test suite.
Installation¶
pip install libvcs
With uv:
uv add libvcs
Try it interactively:
uvx --with libvcs ipython
Tip: libvcs is pre-1.0. Pin a version range in projects to avoid surprises:
# pyproject.toml
dependencies = ["libvcs>=0.37,<0.38"]
Usage¶
1. Synchronize Repositories¶
Clone and update repositories with a consistent API, regardless of the VCS.
Learn more about Synchronization
import pathlib
from libvcs.sync.git import GitSync
# Define your repository
repo = GitSync(
url="https://github.com/vcs-python/libvcs",
path=pathlib.Path.cwd() / "libvcs",
remotes={
'gitlab': 'https://gitlab.com/vcs-python/libvcs'
}
)
# Clone (if not exists) or fetch & update (if exists)
repo.update_repo()
print(f"Current revision: {repo.get_revision()}")
2. Command Abstraction¶
Traverse repository entities intuitively with ORM-like filtering, then run targeted commands against them.
Learn more about Command Abstraction
import pathlib
from libvcs.cmd.git import Git
# Initialize the wrapper
git = Git(path=pathlib.Path.cwd() / 'libvcs')
# Run commands directly
git.clone(url='https://github.com/vcs-python/libvcs.git')
git.checkout(ref='master')
# Traverse branches with ORM-like filtering
git.branches.create('feature/new-gui')
print(git.branches.ls()) # Returns QueryList for filtering
# Target specific entities with contextual commands
git.remotes.set_url(name='origin', url='[email protected]:vcs-python/libvcs.git')
git.tags.create(name='v1.0.0', message='Release version 1.0.0')
3. URL Parsing¶
Stop writing regex for Git URLs. Let libvcs handle the edge cases.
from libvcs.url.git import GitURL
# Validate URLs
GitURL.is_valid(url='https://github.com/vcs-python/libvcs.git') # True
# Parse complex URLs
url = GitURL(url='[email protected]:vcs-python/libvcs.git')
print(url.user) # 'git'
print(url.hostname) # 'github.com'
print(url.path) # 'vcs-python/libvcs'
# Transform URLs
url.hostname = 'gitlab.com'
print(url.to_url()) # '[email protected]:vcs-python/libvcs.git'
4. Testing with Pytest¶
Writing a tool that interacts with VCS? Use our fixtures to keep your tests clean and isolated.
Learn more about Pytest Fixtures
import pathlib
from libvcs.pytest_plugin import CreateRepoPytestFixtureFn
from libvcs.sync.git import GitSync
def test_my_git_tool(
create_git_remote_repo: CreateRepoPytestFixtureFn,
tmp_path: pathlib.Path
):
# Spin up a real, temporary Git server
git_server = create_git_remote_repo()
# Clone it to a temporary directory
checkout_path = tmp_path / "checkout"
repo = GitSync(path=checkout_path, url=f"file://{git_server}")
repo.obtain()
assert checkout_path.exists()
assert (checkout_path / ".git").is_dir()
Project Information¶
Python Support: 3.10+
VCS Support: Git (including AWS CodeCommit), Mercurial (hg), Subversion (svn)
License: MIT
Links & Resources¶
Documentation: libvcs.git-pull.com
Source Code: github.com/vcs-python/libvcs
Issue Tracker: GitHub Issues
Changelog: History
PyPI: pypi.org/project/libvcs
Support¶
Your donations fund development of new features, testing, and support.