To install the unreleased libvcs version, see developmental releases.
pip:
$ pip install --user --upgrade --pre libvcsuv:
$ uv add libvcs --prerelease allowNotes on the upcoming release will go here.
libvcs 0.41.0 is a pytest-plugin compatibility release. It renames libvcs's Git and Mercurial config fixtures so the plugin no longer occupies fixture names used by third-party pytest plugins, and it keeps the docs stack aligned with the current gp-sphinx theme pipeline.
The pytest plugin's gitconfig, set_gitconfig, hgconfig, and set_hgconfig fixtures are renamed to {func}~libvcs.pytest_plugin.vcs_gitconfig, {func}~libvcs.pytest_plugin.set_vcs_gitconfig, {func}~libvcs.pytest_plugin.vcs_hgconfig, and {func}~libvcs.pytest_plugin.set_vcs_hgconfig.
The old names collided with the third-party pytest-gitconfig plugin, whose gitconfig fixture returns a helper object rather than a pathlib.Path. When both plugins were auto-loaded, downstream tests could receive libvcs's fixture and fail with AttributeError: 'PosixPath' object has no attribute 'set'. No deprecation alias is provided because keeping the old fixture names would keep the collision alive. This closes issue #528.
The docs configuration now calls the setup() callback returned by gp-sphinx before registering libvcs's own missing-reference handler. That restores the first-paint theme guard, SPA navigation script, copy-button bridge, and MyST lexer hooks, fixing the visible dark-to-light flash on light-theme loads.
The documentation stack is bumped to gp-sphinx 0.0.1a16, which carries the gp-furo-theme Tailwind v4 refresh and consolidates the Vite asset pipeline under sphinx-vite-builder.
libvcs 0.40.0 gives callers a way to put hard deadlines around VCS subprocesses, removes a costly Git remote lookup that could make vcspull sync look stuck on ref-heavy repositories, and cleans up the public pytest-plugin type surface. The release is aimed at long-running batch sync tools that need one bad repository to fail cleanly instead of freezing the whole run.
CreateRepoPytestFixtureFn is renamed to {class}~libvcs.pytest_plugin.CreateRepoFn. The old name was redundant inside pytest_plugin.py and inconsistent with the shorter Fn suffix used by {class}~libvcs.pytest_plugin.CreateRepoPostInitFn.
The pytest plugin now exposes Env for subprocess environment mappings and GitCommitEnvVars for the value returned by {func}~libvcs.pytest_plugin.git_commit_envvars. Public signatures no longer leak the private _ENV alias.
{func}~libvcs._internal.run.run, {meth}~libvcs.cmd.git.Git.run, {meth}~libvcs.cmd.hg.Hg.run, and {meth}~libvcs.cmd.svn.Svn.run now accept an optional timeout keyword. The default timeout=None preserves the previous unbounded wait behavior.
When a deadline fires, libvcs sends SIGTERM, escalates to SIGKILL after a short grace period, drains captured output from stdout and stderr, and raises {exc}~libvcs.exc.CommandTimeoutError with the deadline duration in its message. The timeout loop also restores pipe blocking mode in finally, unregisters streams at EOF, and avoids busy-looping on platforms where non-blocking pipes are unavailable.
{meth}~libvcs.sync.git.GitSync.remote no longer shells out to git remote show -n, which can still enumerate remote-tracking refs. It now reads the configured remotes through the typed remote manager, making the lookup scale with the number of remotes instead of the number of refs.
This fixes the user-visible vcspull sync hang seen on large repositories such as forks with thousands of remote refs. The method keeps its previous resilience contract: Git subprocess/config failures still degrade to None rather than bubbling as command errors.
{class}~libvcs.pytest_plugin.CreateRepoFn and {class}~libvcs.pytest_plugin.CreateRepoPostInitFn are registered with Sphinx so the pytest fixture summary table links to the public protocol definitions instead of rendering them as plain text.
The API docs pick up visual improvements from the gp-sphinx package family, and the docs stack is bumped to gp-sphinx 0.0.1a8.
libvcs 0.39.0 makes sync failures inspectable. update_repo() now returns structured success/error data for Git, Mercurial, and Subversion instead of silently swallowing many Git errors or mixing None returns with uncaught exceptions.
{meth}~libvcs.sync.git.GitSync.update_repo, {meth}~libvcs.sync.hg.HgSync.update_repo, and {meth}~libvcs.sync.svn.SvnSync.update_repo now return {class}~libvcs.sync.base.SyncResult. Callers can check result.ok and inspect result.errors to report exactly where a sync failed.
Git's previous except CommandError: return paths now record labeled {class}~libvcs.sync.base.SyncError entries for steps such as fetch, rebase, checkout, stash-save, and stash-pop. Mercurial and Subversion wrap obtain, pull, and update failures for API consistency. The top-level package now exports {class}~libvcs.sync.base.SyncResult and {class}~libvcs.sync.base.SyncError.
Companion change: vcspull#512.
Git sync now records rev-list HEAD failures, checkout failures, stash-save failures, invalid-upstream rebase errors, and remote ref lookup failures in the returned result. The invalid-upstream rebase path now returns early after recording the error instead of continuing into stash-pop cleanup.
rev-list calls use fully qualified refs/heads/ refs so a local branch name that collides with a filesystem path is treated as a branch, not as an ambiguous pathspec.
{meth}~libvcs.cmd.git.Git.rev_list now references its _all parameter instead of Python's builtin all.
The Mercurial pull-failure regression test now uses a disposable remote instead of deleting the session-scoped hg_remote_repo, preventing downstream fixture-order failures.
libvcs 0.38.6 completes the test-fixture hardening for Git submodule operations in strict build environments.
The Git config fixture now sets GIT_CONFIG_GLOBAL in addition to GIT_CONFIG. Git excludes GIT_CONFIG when it spawns child processes for operations such as git submodule add, but GIT_CONFIG_GLOBAL is inherited, so nested Git commands can still see protocol.file.allow=always. This is a follow-up to issue #509 and the 0.38.5 fix.
libvcs 0.38.5 keeps the generated test Git config deterministic even when a build environment creates an empty config file first.
The gitconfig fixture no longer returns early when .gitconfig already exists. It always writes the full test config, including protocol.file.allow=always, so strict packaging environments do not accidentally run submodule tests with an empty or incomplete global Git config. This is a follow-up to issue #509.
libvcs 0.38.4 fixes another path through Git submodule tests where child Git processes could not find the fixture-owned global config.
The {func}~libvcs.pytest_plugin.git_repo fixture now applies the fixture-owned home directory before submodule operations run. That gives child Git processes a $HOME/.gitconfig containing protocol.file.allow=always, fixing strict-environment failures from issue #509.
libvcs 0.38.3 starts the Git submodule fixture hardening series for issue #509.
The Git config fixture writes protocol.file.allow=always, allowing test repositories to add local file:// submodules in build environments where Git's default transport policy is stricter.
libvcs 0.38.2 is a packaging and project-tooling release. It moves publishing to PyPI Trusted Publisher and standardizes the local task runner on just.
The docs deployment workflow now uses AWS OIDC authentication instead of static long-lived credentials.
Release uploads now use PyPI Trusted Publisher, reducing secret management for package publication.
The root and docs Makefiles are replaced by justfile recipes, and project docs now point contributors at just test, just build-docs, just ruff, and just mypy.
libvcs 0.38.1 is a docs-quality release for the expanded API reference shipped in 0.38.0.
The docs build removes duplicate targets, stale references, incorrect inline markers, and forward-reference warnings from the generated API pages. The docs config also tolerates offline intersphinx inventories more gracefully.
libvcs 0.38.0 is the major Git command-wrapper expansion. It adds typed manager objects for Git branches, remotes, stashes, tags, worktrees, notes, submodules, and reflogs, and it refreshes the documentation around command traversal.
{class}~libvcs.cmd.git.Git now exposes collection-level managers that return typed command objects instead of forcing callers to parse raw command output. Managers provide ls(), get(), and filter() traversal; entity command objects provide operations such as show(), remove(), rename(), delete(), or subcommand-specific actions.
New manager entry points include {attr}libvcs.cmd.git.Git.branches, {attr}libvcs.cmd.git.Git.remotes, {attr}libvcs.cmd.git.Git.stashes, {attr}libvcs.cmd.git.Git.tags, {attr}libvcs.cmd.git.Git.worktrees, {attr}libvcs.cmd.git.Git.notes, {attr}libvcs.cmd.git.Git.submodules, and {attr}libvcs.cmd.git.Git.reflog. Their ls() methods return {class}~libvcs._internal.query_list.QueryList where filtering is useful.
from libvcs.cmd.git import Git
git = Git(path="/path/to/repo")
remote_branches = git.branches.ls(remotes=True)
release_tag = git.tags.get(tag_name="v1.0.0"){meth}~libvcs.cmd.git.Git.init gains ref_format, make_parents, clearer validation, and support for octal shared permissions such as "0660".
The release fixes argument forwarding and option spelling across {meth}~libvcs.cmd.git.Git.run, {meth}~libvcs.cmd.git.Git.clone, {meth}~libvcs.cmd.git.Git.fetch, {meth}~libvcs.cmd.git.Git.pull, {meth}~libvcs.cmd.git.Git.rebase, and several new manager classes. Notable fixes include URL parsing for remotes with spaces, custom Git notes refs, boolean config serialization, -C path handling, and Git.clone(reference_if_able=...).
The Git command API is split into focused pages for branches, remotes, stashes, tags, worktrees, notes, submodules, and reflogs. The README and topic docs add examples for traversing Git repositories with the manager pattern.
libvcs 0.37.0 updates the supported Python range and keeps CI ahead of the next CPython release.
Support for Python 3.9 is dropped after its upstream end-of-life window. Install libvcs 0.36.x or earlier if you still need Python 3.9 support.
CI now includes Python 3.14 so compatibility work happens before the final interpreter release.
libvcs 0.36.0 improves Git URL detection for the SSH form users paste most often from hosting providers.
Unprefixed SSH URLs such as git@github.com:org/repo.git are now recognized as Git repositories. {func}~libvcs._internal.shortcuts.create_project can auto-detect the VCS type for these URLs, removing the previous need to rewrite them as git+ssh://git@github.com:org/repo.git.
This addresses long-standing downstream vcspull configuration friction reported in vcspull#49 and vcspull#426.
libvcs 0.35.1 restores visible progress output for commands that stream status while they run.
The subprocess runner once again surfaces progress for commands such as git clone, fixing downstream vcspull progress reporting.
The repository adds Cursor/agent rules for the development loop and commit-message format used by this project.
libvcs 0.35.0 switches subprocess output handling to text mode and modernizes annotation style across the codebase.
The legacy subprocess runner now uses text=True, so command output is handled as Unicode strings rather than bytes. Please report compatibility issues if a downstream still depends on byte output.
Python files now use from __future__ import annotations, and Ruff's modern annotation checks are enabled for PEP 585 and PEP 604 syntax.
libvcs 0.34.0 is a project-tooling release. It moves packaging and dependency management from Poetry to uv and hatchling.
uv becomes the project and dependency-management tool, replacing Poetry for local development.
The package build backend moves from Poetry's backend to hatchling, matching current Python packaging conventions.
libvcs 0.33.0 adds Python 3.13 support and makes generated test repositories use shared authorship fixtures.
Python 3.13 is added to package metadata and CI.
The pytest plugin now provides {func}~libvcs.pytest_plugin.vcs_name, {func}~libvcs.pytest_plugin.vcs_email, {func}~libvcs.pytest_plugin.vcs_user, and {func}~libvcs.pytest_plugin.git_commit_envvars. New Git and Mercurial repositories created by the plugin use those fixtures for consistent commit authorship.
libvcs 0.32.3 finishes the config-fixture follow-up for the session-scoped pytest plugin repositories.
hg_remote_repo_single_commit_post_init() and git_remote_repo_single_commit_post_init() now accept the generated Mercurial and Git config values used by the hg_repo and git_repo fixtures.
libvcs 0.32.2 fixes missing VCS configuration on the generated Git and Mercurial repository fixtures.
The session-scoped repository fixtures now run with the Git and Mercurial configuration generated by the pytest plugin.
libvcs 0.32.1 removes an accidental trunk commit before it became part of a prepared feature release.
Unreleased command-wrapper changes from #465 were pushed to trunk too early and are removed from this release line. They return later in the prepared 0.38.0 release.
libvcs 0.32.0 changes how pytest plugin repository config is scoped.
The pytest plugin now sets Git and Mercurial config through session-scoped config fixtures rather than by overriding HOME for each repository. At this point the fixture names were still gitconfig, set_gitconfig, hgconfig, and set_hgconfig; they are renamed later in 0.41.0.
The pytest plugin docs are updated for the session-scoped config fixtures.
libvcs 0.31.0 speeds up pytest-plugin repository creation by reusing starter repositories and cleans up several fixture and command names.
Git, Subversion, and Mercurial repository fixtures are created from initial starter repositories instead of rebuilding every repository from scratch. This substantially reduces fixture setup cost while preserving isolated per-test checkouts.
The old fixture name is replaced with example_git_repo for clearer doctests and documentation.
The internal _list() command helper name is replaced by the public ls() spelling on Git and SVN command wrappers.
libvcs 0.30.1 finishes AWS CodeCommit URL support and refreshes the README.
AWS CodeCommit URL detection now avoids unused weight=0 rule flags and includes registry tests for CodeCommit patterns.
The README is updated alongside the CodeCommit URL examples.
libvcs 0.30.0 adds AWS CodeCommit URL parsing and cleans up Git URL regex constants.
RE_PIP_REV moves from libvcs.url.git to libvcs.url.constants. User matching is split into RE_USER; RE_PATH and RE_SCP no longer include the user pattern; and REGEX_SCP is renamed to RE_SCP for naming consistency.
{class}~libvcs.url.git.GitAWSCodeCommitURL supports AWS CodeCommit HTTPS, SSH, and Git Remote CodeCommit helper forms, including examples such as https://git-codecommit.us-east-1.amazonaws.com/v1/repos/test, ssh://git-codecommit.us-east-1.amazonaws.com/v1/repos/test, codecommit::us-east-1://test, and codecommit://test.
URL documentation and docstrings are updated so previously plain links render as links, and QueryList exception docstrings are corrected.
Poetry moves to 1.8.2, and Ruff applies f-string modernization across more of the codebase.
libvcs 0.29.0 is a maintenance release focused on automated lint cleanup and tool upgrades.
The codebase is normalized with Ruff's broad lint and format passes, including unsafe and preview fixes that were reviewed into the branch.
Ruff moves from 0.2.x to 0.3.x and CI now uses ruff check .. Poetry moves from 1.7.1 to 1.8.1.
libvcs 0.28.2 fixes argument expansion in the Git revision-list wrapper.
{meth}~libvcs.cmd.git.Git.rev_list no longer builds a command that Git reports as fatal: '--max-count': not an integer.
GitHub Actions dependencies are bumped to Node 20-compatible releases.
libvcs 0.28.1 fixes the source distribution contents.
The sdist now includes CHANGES, MIGRATION, and the docs/ tree.
libvcs 0.28.0 improves generic typing for query results.
{class}~libvcs._internal.query_list.QueryList now carries better generic type information for callers that filter and retrieve typed command objects.
libvcs 0.27.0 tightens linting rules and refreshes static analysis.
The project enables additional Ruff checks from flake8-commas, flake8-builtins, and flake8-errmsg. This release note originally used the same issue number later reused by a different pull request; the linting change is historical release context, not the 2026 SyncResult change.
The CodeQL workflow moves away from the previous advanced configuration file.
libvcs 0.26.0 cleans up pytest plugin protocol names, removes dead SVN surface area, and expands docstrings.
CreateProjectCallbackProtocol is renamed to {class}~libvcs.pytest_plugin.CreateRepoPostInitFn, and CreateProjectCallbackFixtureProtocol is renamed to {class}~libvcs.pytest_plugin.CreateRepoFn.
The unused Svn.mergelist command wrapper is removed.
{meth}~libvcs.cmd.git.Git.config receives a corrected docstring.
Functions, methods, classes, and packages receive NumPy-style docstrings for better rendered API pages and doctest coverage.
Ruff now enforces pydocstyle conventions, and the project adds direct usage tests for {class}~libvcs.sync.hg.HgSync.
The test watcher runs initially by default and ignores editor post-save artifacts.
libvcs 0.25.1 fixes dependency grouping for tests.
gp-libs is categorized with test dependencies where it is needed.
libvcs 0.25.0 is a tooling release that moves formatting to Ruff and fixes Poetry dependency-group metadata.
ruff format replaces Black for code formatting, keeping Black-compatible style while removing a separate dev dependency.
Development dependencies move to Poetry dependency groups instead of extras, matching Poetry's current configuration model.
The project updates Poetry from 1.6.1 to 1.7.0.
The dorny/paths-filter action is updated to remove warnings from CI.
libvcs 0.24.0 fixes Git remote URL parsing and continues the Ruff migration.
Git remote URLs containing @ are no longer chopped after the protocol. This fixes issue #431.
Test configuration now lives with the rest of the project configuration.
The ERA rule family produced too many false positives for this codebase and is removed from the active lint set.
{mod}libvcs._internal.query_list follows the project's namespace-import convention for typing.
libvcs 0.23.0 is a maintenance release for code-quality cleanup.
The repository enables more Ruff settings and applies a mix of automated and manual fixes.
libvcs 0.23.0post0 fixes comments accidentally damaged by the 0.23.0 automated cleanup.
Comments missed during the 0.23.0 QA pass are restored to readable wording.
libvcs 0.22.2 is a maintenance release for mypy compatibility.
{class}~libvcs._internal.subprocess.SubprocessCommand now types its text parameter correctly under the active mypy version.
libvcs 0.22.1 restores Black as a temporary formatter dependency.
Black remains in the dev dependency set to accompany Ruff until Ruff can fully replace it for this project.
libvcs 0.22.0 moves linting, formatting, and import sorting to Ruff.
Ruff takes over work previously split across Black, isort, flake8, and flake8 plugins. The result is a much faster local linting and formatting loop.
The project dependency manager is updated to Poetry 1.5.0.
libvcs 0.21.2 keeps internal dataclass helpers compatible with mypy 1.2.0.
{class}~libvcs._internal.dataclasses.SkipDefaultFieldsReprMixin receives a typing fix found by the mypy upgrade.
The project type checker is bumped to mypy 1.2.0.
libvcs 0.21.1 finishes removing typing_extensions from runtime dependencies.
More leftover typing_extensions runtime imports are removed after #437.
libvcs 0.21.0 adds single-object retrieval to QueryList.
{meth}~libvcs._internal.query_list.QueryList.get returns the single matching object, raises when no object or multiple objects match, and supports default= for not-found cases.
The dependency is removed from runtime requirements, with a narrow mypy suppression kept for dataclass internals.
libvcs 0.20.0 adds Python 3.11 support and updates URL parser internals for Python 3.11's dataclass validation.
Python 3.11 is added to the supported interpreter range.
URL parser rule_map values move from dataclass fields to class attributes. This avoids Python 3.11's dataclass error for mutable default fields while preserving parser behavior.
libvcs 0.19.1 follows up the command-wrapper migration with fixture and docs updates.
Git command documentation gains separate pages for remotes, stashes, and submodules.
The Git sync test suite is updated for the fixture model used by the command wrappers.
libvcs 0.19.0 moves sync code onto the command-wrapper layer and expands Git, SVN, and Mercurial command coverage.
Git, SVN, and Mercurial sync implementations now run through libvcs.cmd, making command construction more consistent and giving sync paths access to command-level features such as realtime logging.
Git gains wrappers for remotes, stashes, submodules, revision parsing, revision listing, symbolic refs, and refs. SVN gains wrappers for lock, unlock, and propset. Mercurial gains improved clone, pull, and update wrappers.
libvcs 0.18.1 is a maintenance release.
The release improves documentation and adds CITATION.cff.
Development packages are updated.
libvcs 0.18.0 improves URL parser rule precedence.
URL rules now carry a weight, so more specific rules can win over general defaults. This fixes cases where lower-priority defaults could overwrite the intended parser result.
libvcs 0.17.0 expands URL matching and lets project creation infer the right VCS from a repository URL.
The URL matching vocabulary changes from Matcher / MatcherRegistry / matches / default_patterns / MATCHERS to the newer Rule / Rules / rule_map / patterns / RULES names.
{class}~libvcs.url.registry.VCSRegistry can identify which VCS parser matches a URL, and {func}~libvcs._internal.shortcuts.create_project can guess the VCS type when callers do not pass one explicitly.
The Git, SVN, and Mercurial remote repository factory fixtures accept init_cmd_args; for Git this allows non-bare remotes by passing init_cmd_args=None.
The URL parser family gains Mercurial and Subversion base and pip URL variants, fixes is_valid() classmethod behavior, and reduces duplicated parser code.
{meth}~libvcs.sync.git.GitSync.update_repo no longer fails when the local working tree has only untracked files.
Coverage configuration moves into pyproject.toml, conftest.py moves to the repository root, and unused tmuxp setup files are removed. The top-level conftest.py placement keeps pytest plugin loading compatible with pytest's top-level plugin rules.
libvcs 0.16.5 keeps the pytest plugin compatible with pytest's public API.
The plugin stops importing pytest internals directly, avoiding compatibility problems with newer pytest releases.
libvcs 0.16.4 updates the packaging toolchain.
The project updates from Poetry 1.1.x to Poetry 1.2.x.
libvcs 0.16.3 improves QueryList object handling, adds pytest-plugin coverage, and speeds up CI.
{class}~libvcs._internal.query_list.QueryList supports lookups against object attributes, with docs showing deeper lookup paths through keygetter and parse_lookup.
The docs gain examples for deep object lookups through query-list helpers.
The release adds a basic pytest-plugin test and object-lookup tests for QueryList.
CI avoids fetching unused apt packages, isolates release image pulls to release jobs, and cleans up CodeQL setup.
libvcs 0.16.2 removes a temporary dependency.
The pytest plugin no longer needs Faker as a runtime dependency.
libvcs 0.16.1 temporarily adds a missing dependency needed by the pytest plugin.
Faker is added while the fixture implementation is adjusted to avoid needing it long term.
libvcs 0.16.0 introduces the pytest plugin for creating temporary repositories in tests.
The new {doc}/api/pytest-plugin plugin provides fixtures for local Git, Mercurial, and Subversion repositories. Test suites can create fresh repositories without hand-rolling VCS setup and cleanup.
libvcs 0.15.0 renames the public package layout around URL parsing and repository synchronization, moves to a src/ layout, and consolidates docs tooling on gp-libs.
libvcs.parse becomes libvcs.url, and libvcs.projects becomes libvcs.sync. BaseProject, MercurialProject, SubversionProject, and GitProject become {class}~libvcs.sync.base.BaseSync, {class}~libvcs.sync.hg.HgSync, {class}~libvcs.sync.svn.SvnSync, and {class}~libvcs.sync.git.GitSync.
The custom which() helper is deprecated in favor of {func}shutil.which, and mkdir_p() is removed in favor of {func}os.makedirs or {meth}pathlib.Path.mkdir with parents=True.
The docs move from sphinx-autoapi and sphinx-autoissues to gp-libs utilities for linkified issues and stable autodoc table-of-contents behavior.
The package tree is moved under src/, and CI/configuration are updated for the new import layout.
The dev lint stack adds flake8-bugbear and flake8-comprehensions.
libvcs 0.14.0 introduces the URL parser framework, reaches strict mypy compliance, and removes deprecated APIs from the 0.13 line.
libvcs.shortcuts is removed, create_project_from_pip_url() is removed, and create_project() moves to the internal shortcuts module. Typing helpers move from libvcs.types to libvcs._internal.types.
Support for git+git URLs is removed because pip removed that insecure transport. Redundant uses_netloc registration for git and git+ssh is also removed because CPython already includes it.
The unused flat keyword on {class}~libvcs.sync.git.GitSync is removed. The equivalent data can be retrieved from GitRemote.to_dict().
The new parser framework returns dataclass-backed URL objects for Git, Mercurial, and Subversion. Parsers can validate input, expose parsed fields, and export clone/checkout-compatible URLs through to_url().
Key classes include {class}~libvcs.url.git.GitBaseURL, {class}~libvcs.url.git.GitPipURL, {class}~libvcs.url.git.GitURL, {class}~libvcs.url.hg.HgURL, and {class}~libvcs.url.svn.SvnURL. Detection can be extended by adding {class}~libvcs.url.base.Rule entries to {class}~libvcs.url.base.RuleMap.
The codebase now passes strict mypy checks, improving the reliability of libvcs as a typed library.
{class}~libvcs.sync.hg.HgSync receives the Mercurial cloning fix from the 0.13.x line.
The release includes a refreshed logo and initial topic documentation for the URL parser framework.
libvcs 0.13.6 continues the transition away from public shortcut helpers.
libvcs.shortcuts moves to libvcs._internal.shortcuts ahead of its public removal in 0.14.
libvcs 0.13.5 announces the shortcut deprecations that land in 0.14.
The release notes the upcoming removal of create_project_from_pip_url() and the move of create_project() to internal API, and fixes the import path used by libvcs.shortcuts.
libvcs 0.13.4 normalizes the VCS literal type name.
The type alias spelling is corrected to use the all-caps VCS acronym.
libvcs 0.13.3 improves overloads for project creation.
create_project() gains overloads that preserve the concrete project type, such as returning {class}~libvcs.sync.git.GitSync for Git inputs.
libvcs 0.13.2 improves Git project remote typings.
GitProject.remotes gains overload coverage on the 0.13.x line.
libvcs 0.13.1 fixes Mercurial cloning.
Mercurial cloning works again for {class}~libvcs.sync.hg.HgSync.
libvcs 0.13.0 continues the command-wrapper and sync API cleanup from 0.12. It makes project constructors keyword-only, moves older helper modules under _internal, and adds more typed command wrappers.
libvcs.cmd.core moves to libvcs._internal.run, and libvcs.utils moves to libvcs._internal. The move marks those helpers as closed internal API even when they remain importable.
The internal runner's first parameter is renamed from cmd to args to match subprocess.Popen, and its parameters become a pass-through to subprocess.
Project/sync classes no longer accept positional arguments. Code should use keyword arguments such as GitSync(url="https://github.com/vcs-python/libvcs.git").
parent_dir is removed in favor of project.parent.path, and repo_name becomes a property.
The experimental command layer gains {class}~libvcs.cmd.git.Git wrappers for help, reset, checkout, status, and config. Git commands also support -C path handling in addition to subprocess cwd.
Git, SVN, and Mercurial command wrappers correctly pass argument lists through to subprocess calls, fixing cases such as git config --get color.diff.
Developer documentation gains mypy notes and updated examples for the lint/type-checking workflow.
The codebase gains basic mypy checking, type annotations for subprocess helpers, and make targets for type-checking workflows.
{class}~libvcs._internal.subprocess.SubprocessCommand wraps subprocess calls in a dataclass so execution can be inspected, modified, mocked, and controlled.
libvcs 0.12.4 backports command argument handling fixes from 0.13.x.
Mercurial and Subversion command wrappers no longer lose or reshape subprocess arguments incorrectly.
libvcs 0.12.3 backports Git command argument handling fixes from 0.13.x.
Git command wrappers correctly pass arguments such as git config --get color.diff through to subprocess.
libvcs 0.12.2 refreshes package metadata.
Package classifiers are updated for PyPI.
libvcs 0.12.1 marks the package as typed and improves metadata.
The package ships libvcs/py.typed and updates package keywords/subscription metadata.
libvcs 0.12.0 is a broad API transition from the original repository classes toward sync classes and typed command wrappers. It also drops older Python versions and introduces doctest-driven documentation work.
The old GitRepo, SVNRepo, MercurialRepo, and BaseRepo names move to GitSync, SVNProject, HgSync, and BaseSync, with modules reorganized under libvcs.sync. The constructor path parameter is renamed from repo_dir to path.
Logging helpers move onto BaseSync.log, ProjectLoggingAdapter becomes CmdLoggingAdapter, create_repo becomes create_project, and GitRemote / GitStatus move to dataclass-style objects.
Experimental typed wrappers land for Git, SVN, and Mercurial commands. Initial Git coverage includes run, clone, init, pull, and rebase; SVN coverage includes checkout, update, status, auth, blame, and commit; Mercurial coverage includes run and clone.
GitSync accepts remotes during construction, and GitSync.update_repo() accepts set_remotes=True for sync flows that should reconcile remote configuration.
Maintenance and bug support for those interpreters remains on the v0.11.x branch.
API documentation is split by module, and sphinx-autoapi is evaluated for table-of-contents support.
The release adds CodeQL, more parametrized Git tests, CI Poetry caching, doctest support through pytest, and PyPI publication on tags.
libvcs 0.11.1 fixes CVE-2022-21187, a command-injection vulnerability in Mercurial repository URLs.
Mercurial URLs using aliases could execute arbitrary shell commands during .obtain() or uncloned .update_repo() calls. The vulnerability was reported by Alessio Della Libera and is tracked as CVE-2022-21187, with additional advisories at NVD and Snyk.
The documentation theme moves to Furo, with updated docs commands for local development.
The test suite moves from py.path-based tmp directories to pathlib-based pytest fixtures and updates text fixtures for Git and Mercurial config.
libvcs 0.11.0 refreshes interpreter support and project tooling.
The package adds Python 3.10 compatibility and removes Python 3.6 from the supported range.
Poetry moves from 1.1.7 to 1.1.12, and the repository adds a pre-commit configuration.
libvcs 0.10.1 fixes Git sync edge cases and refreshes Poetry.
Git sync now checks out the remote branch before rebasing, with thanks to @jensens.
Revision handling for pip-style URLs is fixed, with thanks to @jensens.
CI uses Poetry 1.1.7 and relocks with the compatible installer.
libvcs 0.10 converts the changelog to Markdown.
The changelog is converted from its previous format to Markdown.
libvcs 0.9 is a major pre-1.0 cleanup release that removes Python 2.7 support, adds annotations, and prepares for larger API reshaping.
Repository objects now require repo_dir, and libvcs.git.GitRepo.status() returns a structured status tuple.
The package now targets Python 3 only.
The codebase gains annotations and updates Black to 21.6b0.
libvcs 0.5 overhauls the documentation and packaging flow.
The docs are rebuilt around NumPy-style API formatting, Markdown sources, GitHub Actions deployment, S3, and CloudFront.
Package build and publication move to Poetry, and the development docs are rewritten.
libvcs 0.4.4 tightens the repository object model.
libvcs.base.BaseRepo stops assigning **kwargs directly onto the object, removes __slots__, and renames name to repo_name.
libvcs 0.4.3 fixes branch parsing in Git status output.
libvcs.git.extract_status() can capture branch names containing special characters.
libvcs 0.4.2 adds Git status helpers and fixes current-remote detection.
libvcs.git.GitRepo.status() and libvcs.git.extract_status() expose structured status data from git status.
libvcs.git.GitRepo.get_current_remote_name() handles upstream branches that have not been pushed yet.
libvcs 0.4.1 removes a stray log statement.
An accidental log statement is removed.
libvcs 0.4 reorganizes Git remote handling to reduce implicit behavior before the 0.5 release.
GitRepo.remotes_get, GitRepo.remote_get, and GitRepo.remote_set are renamed to GitRepo.remotes(), GitRepo.remote(), and GitRepo.set_remote(). The remotes constructor argument is deprecated and no longer drives implicit remote setup during obtain().
GitRepo.set_remote() now requires an explicit remote name and URL, and GitRepo.remote() returns a structured GitRemote value that includes the remote name.
GitRepo.get_git_version() and GitRepo.get_current_remote_name() are added.
libvcs 0.3.3 fixes repository overwrite behavior and removes an f-string from tests.
libvcs.git.GitRepo.obtain updates a remote when it already exists.
libvcs 0.3.2 fixes remote URL updates.
libvcs.git.GitRepo.remote_set() gains an overwrite parameter for replacing existing remote URLs.
libvcs 0.3.1post1 fixes package metadata after 0.3.1.
The version in project metadata is fixed, and developer docs are updated.
libvcs 0.3.1 updates packaging and Python 3.8 subprocess compatibility.
The release fixes a noisy subprocess.Popen warning on Python 3.8.
The project adopts Poetry packaging, sorts imports, adds isort configuration, and adds project URLs.
libvcs 0.3.0 moves the project under the vcs-python organization.
A platform-specific attribute assignment issue is fixed.
Repository ownership and package metadata are updated for the organization move.
libvcs 0.2.3 refreshes docs links and pins older tooling.
Documentation links are updated to the public docs site.
The release pins and updates vulture, flake8, pytest-mock, pytest, and alabaster for the era's build environment.
libvcs 0.2.2 fixes a downstream vcspull integration issue.
The release fixes a bug involving an unused support module, tracked downstream in vcspull#43.
libvcs 0.2.1 updates tests and missing-VCS handling.
The executable lookup helper now handles not-found cases and allows manual search paths.
The suite improves behavior when Git or Subversion are not installed.
pytest moves to 3.0.2 and an unused pytest-raisesregexp dependency is removed.
libvcs 0.2.0 adds realtime progress callbacks and broader interpreter support.
progress_callback can receive realtime output from long-running commands such as git fetch.
An unbound local variable during Git updates is fixed.
The release adds official PyPy and PyPy3 support, along with more internal factoring and tests. Thanks to @jcfr.
libvcs 0.1.7 completes the initial removal of buffered command output.
The command-run result exposes check_returncode. Thanks to @jcfr.
All remaining run_buffered buffering paths are removed from the library.
libvcs 0.1.6 removes colorama and library-owned logging configuration.
The package removes its logging module and leaves handler, level, formatter, and propagation choices to applications.
The colorama dependency is no longer needed.
libvcs 0.1.5 fixes logging adapter context.
Repository context is passed through to repo logging adapters.
libvcs 0.1.4 fixes Git update progress callback signatures.
The Git update progress-end helper has the expected signature.
libvcs 0.1.3 adds a convenience repository factory.
The initial repository factory handles regular VCS URLs, and API docs are updated.
libvcs 0.1.2 adjusts constructor and pip-URL parameter names.
Base accepts repo_dir instead of name and parent_dir, and create_repo_from_pip_url() accepts pip_url instead of url.
libvcs 0.1.1 removes unused dependencies.
Unused pyyaml, kaptan, and click dependencies are removed.
libvcs 0.1.0 is the initial standalone release split from vcspull.
The VCS support library is split out of vcspull for independent release and reuse.