Skip to main content

Lite, typed, python utilities for Git, SVN, Mercurial, etc.

Project description

libvcs logo

libvcs

The Swiss Army Knife for Version Control Systems in Python.

PyPI version Python versions Tests status Coverage License

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, and svn through 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)
result = repo.update_repo()

if result.ok:
    print(f"Current revision: {repo.get_revision()}")
else:
    for error in result.errors:
        print(f"Sync failed at {error.step}: {error.message}")

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='git@github.com: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.

Learn more about URL Parsing

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='git@github.com: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())  # 'git@gitlab.com: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 CreateRepoFn
from libvcs.sync.git import GitSync

def test_my_git_tool(
    create_git_remote_repo: CreateRepoFn,
    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

Support

Your donations fund development of new features, testing, and support.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

libvcs-0.43.0.tar.gz (631.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

libvcs-0.43.0-py3-none-any.whl (102.4 kB view details)

Uploaded Python 3

File details

Details for the file libvcs-0.43.0.tar.gz.

File metadata

  • Download URL: libvcs-0.43.0.tar.gz
  • Upload date:
  • Size: 631.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for libvcs-0.43.0.tar.gz
Algorithm Hash digest
SHA256 8b89d7f80ea6bcb5d3b4b5f07e9dd6410e5f26a5e22883f69fd812e7e12b391b
MD5 010dcc66e4f53d8d9f36fd2ccbbaa96e
BLAKE2b-256 4a699a193122017217599b65b36598e399d7537f755a598e828305609857eeae

See more details on using hashes here.

Provenance

The following attestation bundles were made for libvcs-0.43.0.tar.gz:

Publisher: tests.yml on vcs-python/libvcs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file libvcs-0.43.0-py3-none-any.whl.

File metadata

  • Download URL: libvcs-0.43.0-py3-none-any.whl
  • Upload date:
  • Size: 102.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for libvcs-0.43.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3bdc69fda0f8ec7482e7afc344b2e84eaabd9bfbf5b7f1ec44563c3322df0000
MD5 5443244abe5f11fd70405d4f506280fc
BLAKE2b-256 7668cc14f95b5468331cdcf1ffe6d2c4f4ce0ff04838b21cfa4d08e565d98398

See more details on using hashes here.

Provenance

The following attestation bundles were made for libvcs-0.43.0-py3-none-any.whl:

Publisher: tests.yml on vcs-python/libvcs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page