Skip to content

Latest commit

 

History

History
1515 lines (764 loc) · 53.4 KB

File metadata and controls

1515 lines (764 loc) · 53.4 KB

Changelog

To install the unreleased libvcs version, see developmental releases.

pip:

$ pip install --user --upgrade --pre libvcs

uv:

$ uv add libvcs --prerelease allow

libvcs 0.42.x (unreleased)

Notes on the upcoming release will go here.

libvcs 0.41.0 (2026-05-10)

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.

Breaking changes

pytest plugin config fixtures move under the vcs_ namespace (#529)

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.

Fixes

Docs theme setup now chains gp-sphinx hooks (#527)

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.

Documentation

Docs site uses the current gp-furo theme stack (#526)

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 (2026-04-25)

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.

Breaking changes

pytest plugin type names are simplified (#521)

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.

What's new

pytest plugin exports public type aliases (#521)

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.

Subprocess runners accept timeout= (#524)

{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.

Fixes

Ref-heavy Git remotes no longer stall URL lookup (#524)

{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.

Documentation

pytest plugin type references render as links (#521)

{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.

API docs receive gp-sphinx visual updates (#522, #523)

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 (2026-02-07)

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.

What's new

update_repo() returns structured sync results (#514)

{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.

Fixes

Git sync reports more failure paths instead of falling through (#514)

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.

Branch names that look like paths are disambiguated (#514)

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.

Git.rev_list() uses the _all parameter (#514)

{meth}~libvcs.cmd.git.Git.rev_list now references its _all parameter instead of Python's builtin all.

Development

Mercurial pull-failure tests no longer damage shared fixtures (#514)

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 (2026-01-27)

libvcs 0.38.6 completes the test-fixture hardening for Git submodule operations in strict build environments.

Fixes

set_gitconfig also exports GIT_CONFIG_GLOBAL (#513)

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 (2026-01-25)

libvcs 0.38.5 keeps the generated test Git config deterministic even when a build environment creates an empty config file first.

Fixes

gitconfig always writes the full fixture config (#512)

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 (2026-01-25)

libvcs 0.38.4 fixes another path through Git submodule tests where child Git processes could not find the fixture-owned global config.

Fixes

git_repo depends on set_home (#511)

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 (2026-01-25)

libvcs 0.38.3 starts the Git submodule fixture hardening series for issue #509.

Fixes

Git fixture config allows local file:// submodules (#510)

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 (2026-01-24)

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.

Documentation

Documentation deployment uses OIDC credentials (#499)

The docs deployment workflow now uses AWS OIDC authentication instead of static long-lived credentials.

Development

PyPI publishing uses Trusted Publisher (#499)

Release uploads now use PyPI Trusted Publisher, reducing secret management for package publication.

Development tasks move from Makefile to justfile (#500)

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 (2025-12-06)

libvcs 0.38.1 is a docs-quality release for the expanded API reference shipped in 0.38.0.

Documentation

API docs warning cleanup (#498)

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 (2025-11-30)

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.

What's new

Git subcommands use Manager/Cmd objects (#465)

{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")

Git.init() covers newer init options (#465)

{meth}~libvcs.cmd.git.Git.init gains ref_format, make_parents, clearer validation, and support for octal shared permissions such as "0660".

Fixes

Existing Git wrappers receive correctness fixes (#465)

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=...).

Documentation

Git command docs split by subcommand (#465)

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 (2025-11-01)

libvcs 0.37.0 updates the supported Python range and keeps CI ahead of the next CPython release.

Breaking changes

Python 3.10 is now the minimum (#497)

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.

Development

Python 3.14 joins the test matrix (#496)

CI now includes Python 3.14 so compatibility work happens before the final interpreter release.

libvcs 0.36.0 (2025-06-22)

libvcs 0.36.0 improves Git URL detection for the SSH form users paste most often from hosting providers.

What's new

SCP-style Git URLs are detected without git+ssh:// (#490)

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 (2025-06-21)

libvcs 0.35.1 restores visible progress output for commands that stream status while they run.

Fixes

Realtime command output reaches progress callbacks again (#493)

The subprocess runner once again surfaces progress for commands such as git clone, fixing downstream vcspull progress reporting.

Development

Agent rules document the local development loop (#488)

The repository adds Cursor/agent rules for the development loop and commit-message format used by this project.

libvcs 0.35.0 (2025-02-22)

libvcs 0.35.0 switches subprocess output handling to text mode and modernizes annotation style across the codebase.

Breaking changes

run() now returns text output (#485)

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.

Development

Deferred annotations become the project default (#483)

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 (2024-11-22)

libvcs 0.34.0 is a project-tooling release. It moves packaging and dependency management from Poetry to uv and hatchling.

Development

Package management moves from Poetry to uv (#479)

uv becomes the project and dependency-management tool, replacing Poetry for local development.

Build backend moves to hatchling (#479)

The package build backend moves from Poetry's backend to hatchling, matching current Python packaging conventions.

libvcs 0.33.0 (2024-10-13)

libvcs 0.33.0 adds Python 3.13 support and makes generated test repositories use shared authorship fixtures.

What's new

Python 3.13 is supported (#477)

Python 3.13 is added to package metadata and CI.

pytest plugin authorship fixtures (#476)

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 (2024-10-13)

libvcs 0.32.3 finishes the config-fixture follow-up for the session-scoped pytest plugin repositories.

Fixes

Remote repository post-init callbacks receive VCS config (#475)

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 (2024-10-13)

libvcs 0.32.2 fixes missing VCS configuration on the generated Git and Mercurial repository fixtures.

Fixes

git_repo and hg_repo apply their config fixtures (#475)

The session-scoped repository fixtures now run with the Git and Mercurial configuration generated by the pytest plugin.

libvcs 0.32.1 (2024-10-12)

libvcs 0.32.1 removes an accidental trunk commit before it became part of a prepared feature release.

Fixes

Accidental Git command work is reverted

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 (2024-10-12)

libvcs 0.32.0 changes how pytest plugin repository config is scoped.

Breaking changes

Git and Mercurial config fixtures are session-scoped (#475)

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.

Documentation

pytest plugin docs cover the new config flow (#475)

The pytest plugin docs are updated for the session-scoped config fixtures.

libvcs 0.31.0 (2024-10-12)

libvcs 0.31.0 speeds up pytest-plugin repository creation by reusing starter repositories and cleans up several fixture and command names.

Breaking changes

pytest plugin repositories are cached from starter repos (#472)

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.

git_local_clone is renamed to example_git_repo (#468)

The old fixture name is replaced with example_git_repo for clearer doctests and documentation.

Listing helpers are named ls() (#466)

The internal _list() command helper name is replaced by the public ls() spelling on Git and SVN command wrappers.

libvcs 0.30.1 (2024-06-18)

libvcs 0.30.1 finishes AWS CodeCommit URL support and refreshes the README.

Fixes

AWS CodeCommit detection handles URL registry details (#464)

AWS CodeCommit URL detection now avoids unused weight=0 rule flags and includes registry tests for CodeCommit patterns.

Documentation

README receives a broad refresh (#464)

The README is updated alongside the CodeCommit URL examples.

libvcs 0.30.0 (2024-06-18)

libvcs 0.30.0 adds AWS CodeCommit URL parsing and cleans up Git URL regex constants.

Breaking changes

Git URL regex constants are renamed and split (#463)

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.

What's new

AWS CodeCommit URLs are parsed as Git URLs (#443)

{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.

Documentation

URL docs gain richer links (#443)

URL documentation and docstrings are updated so previously plain links render as links, and QueryList exception docstrings are corrected.

Development

Poetry and Ruff are refreshed (#460)

Poetry moves to 1.8.2, and Ruff applies f-string modernization across more of the codebase.

libvcs 0.29.0 (2024-03-24)

libvcs 0.29.0 is a maintenance release focused on automated lint cleanup and tool upgrades.

Development

Ruff cleanup is applied across the codebase (#458)

The codebase is normalized with Ruff's broad lint and format passes, including unsafe and preview fixes that were reviewed into the branch.

Ruff and Poetry are updated (#457)

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 (2024-02-17)

libvcs 0.28.2 fixes argument expansion in the Git revision-list wrapper.

Fixes

Git.rev_list() expands --max-count correctly (#455)

{meth}~libvcs.cmd.git.Git.rev_list no longer builds a command that Git reports as fatal: '--max-count': not an integer.

Development

CI actions move to Node 20 releases (#456)

GitHub Actions dependencies are bumped to Node 20-compatible releases.

libvcs 0.28.1 (2024-02-08)

libvcs 0.28.1 fixes the source distribution contents.

Fixes

Source distributions include docs and changelog files (#454)

The sdist now includes CHANGES, MIGRATION, and the docs/ tree.

libvcs 0.28.0 (2024-02-07)

libvcs 0.28.0 improves generic typing for query results.

What's new

QueryList generic support improves (#453)

{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 (2024-02-06)

libvcs 0.27.0 tightens linting rules and refreshes static analysis.

Development

More Ruff rule families are enabled (#514)

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.

CodeQL uses GitHub's default setup

The CodeQL workflow moves away from the previous advanced configuration file.

libvcs 0.26.0 (2023-11-26)

libvcs 0.26.0 cleans up pytest plugin protocol names, removes dead SVN surface area, and expands docstrings.

Breaking changes

pytest plugin protocol names are simplified (#450)

CreateProjectCallbackProtocol is renamed to {class}~libvcs.pytest_plugin.CreateRepoPostInitFn, and CreateProjectCallbackFixtureProtocol is renamed to {class}~libvcs.pytest_plugin.CreateRepoFn.

Fixes

Dead SVN merge-list wrapper is removed (#450)

The unused Svn.mergelist command wrapper is removed.

Git.config docs are corrected (#450)

{meth}~libvcs.cmd.git.Git.config receives a corrected docstring.

Documentation

Public APIs gain docstrings (#449)

Functions, methods, classes, and packages receive NumPy-style docstrings for better rendered API pages and doctest coverage.

Development

pydocstyle joins the Ruff rule set (#449)

Ruff now enforces pydocstyle conventions, and the project adds direct usage tests for {class}~libvcs.sync.hg.HgSync.

pytest-watcher is configured (#450)

The test watcher runs initially by default and ignores editor post-save artifacts.

libvcs 0.25.1 (2023-11-23)

libvcs 0.25.1 fixes dependency grouping for tests.

Fixes

gp-libs moves to test dependencies

gp-libs is categorized with test dependencies where it is needed.

libvcs 0.25.0 (2023-11-19)

libvcs 0.25.0 is a tooling release that moves formatting to Ruff and fixes Poetry dependency-group metadata.

Development

Formatting moves from Black to Ruff format (#448)

ruff format replaces Black for code formatting, keeping Black-compatible style while removing a separate dev dependency.

Poetry dependency groups are corrected

Development dependencies move to Poetry dependency groups instead of extras, matching Poetry's current configuration model.

Poetry moves to 1.7.0

The project updates Poetry from 1.6.1 to 1.7.0.

CI dependency actions are refreshed

The dorny/paths-filter action is updated to remove warnings from CI.

libvcs 0.24.0 (2023-10-22)

libvcs 0.24.0 fixes Git remote URL parsing and continues the Ruff migration.

Fixes

Git remote URLs preserve @ after the protocol (#446)

Git remote URLs containing @ are no longer chopped after the protocol. This fixes issue #431.

Development

pytest configuration moves to pyproject.toml (#441)

Test configuration now lives with the rest of the project configuration.

Ruff's eradicate rule is disabled

The ERA rule family produced too many false positives for this codebase and is removed from the active lint set.

typing is imported as t in query-list internals (#439)

{mod}libvcs._internal.query_list follows the project's namespace-import convention for typing.

libvcs 0.23.0 (2023-08-20)

libvcs 0.23.0 is a maintenance release for code-quality cleanup.

Development

Additional Ruff rules are applied (#438)

The repository enables more Ruff settings and applies a mix of automated and manual fixes.

libvcs 0.23.0post0 (2023-08-20)

libvcs 0.23.0post0 fixes comments accidentally damaged by the 0.23.0 automated cleanup.

Fixes

Cleaned-up comments are corrected

Comments missed during the 0.23.0 QA pass are restored to readable wording.

libvcs 0.22.2 (2023-08-20)

libvcs 0.22.2 is a maintenance release for mypy compatibility.

Fixes

SubprocessCommand accepts the typed text parameter

{class}~libvcs._internal.subprocess.SubprocessCommand now types its text parameter correctly under the active mypy version.

libvcs 0.22.1 (2023-05-28)

libvcs 0.22.1 restores Black as a temporary formatter dependency.

Development

Black returns while Ruff formatting matures

Black remains in the dev dependency set to accompany Ruff until Ruff can fully replace it for this project.

libvcs 0.22.0 (2023-05-27)

libvcs 0.22.0 moves linting, formatting, and import sorting to Ruff.

Development

Ruff replaces several Python lint/format tools

Ruff takes over work previously split across Black, isort, flake8, and flake8 plugins. The result is a much faster local linting and formatting loop.

Poetry is updated to 1.5.0

The project dependency manager is updated to Poetry 1.5.0.

libvcs 0.21.2 (2023-04-07)

libvcs 0.21.2 keeps internal dataclass helpers compatible with mypy 1.2.0.

Fixes

SkipDefaultFieldsReprMixin types under mypy 1.2.0

{class}~libvcs._internal.dataclasses.SkipDefaultFieldsReprMixin receives a typing fix found by the mypy upgrade.

Development

mypy is updated to 1.2.0

The project type checker is bumped to mypy 1.2.0.

libvcs 0.21.1 (2023-03-15)

libvcs 0.21.1 finishes removing typing_extensions from runtime dependencies.

Fixes

Runtime imports no longer need typing_extensions

More leftover typing_extensions runtime imports are removed after #437.

libvcs 0.21.0 (2023-03-15)

libvcs 0.21.0 adds single-object retrieval to QueryList.

What's new

QueryList.get() retrieves one matching object (#435)

{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.

Fixes

typing_extensions is no longer a required runtime dependency (#437)

The dependency is removed from runtime requirements, with a narrow mypy suppression kept for dataclass internals.

libvcs 0.20.0 (2022-10-31)

libvcs 0.20.0 adds Python 3.11 support and updates URL parser internals for Python 3.11's dataclass validation.

What's new

Python 3.11 is supported (#433)

Python 3.11 is added to the supported interpreter range.

URL rule maps are class attributes (#433)

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 (2022-10-23)

libvcs 0.19.1 follows up the command-wrapper migration with fixture and docs updates.

Documentation

Git command docs split into subcommand pages (#432)

Git command documentation gains separate pages for remotes, stashes, and submodules.

Development

Git sync tests use updated fixtures (#432)

The Git sync test suite is updated for the fixture model used by the command wrappers.

libvcs 0.19.0 (2022-10-23)

libvcs 0.19.0 moves sync code onto the command-wrapper layer and expands Git, SVN, and Mercurial command coverage.

What's new

Sync uses the command library (#430)

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.

More VCS command wrappers are available (#430)

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 (2022-10-23)

libvcs 0.18.1 is a maintenance release.

Documentation

Citation and docs updates

The release improves documentation and adds CITATION.cff.

Development

Development dependencies are refreshed

Development packages are updated.

libvcs 0.18.0 (2022-10-09)

libvcs 0.18.0 improves URL parser rule precedence.

What's new

URL matcher weights control parser precedence (#428)

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 (2022-09-25)

libvcs 0.17.0 expands URL matching and lets project creation infer the right VCS from a repository URL.

Breaking changes

URL matcher types are renamed (#417)

The URL matching vocabulary changes from Matcher / MatcherRegistry / matches / default_patterns / MATCHERS to the newer Rule / Rules / rule_map / patterns / RULES names.

What's new

URL registry detects VCS type from a URL (#420)

{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.

pytest repository factories can customize Git init args (#426)

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.

Mercurial and Subversion URL parser coverage expands (#423)

The URL parser family gains Mercurial and Subversion base and pip URL variants, fixes is_valid() classmethod behavior, and reduces duplicated parser code.

Fixes

Git sync handles untracked-only working trees (#425)

{meth}~libvcs.sync.git.GitSync.update_repo no longer fails when the local working tree has only untracked files.

Development

Test and coverage configuration are consolidated (#421)

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 (2022-09-21)

libvcs 0.16.5 keeps the pytest plugin compatible with pytest's public API.

Fixes

pytest imports use public APIs (#418)

The plugin stops importing pytest internals directly, avoiding compatibility problems with newer pytest releases.

libvcs 0.16.4 (2022-09-18)

libvcs 0.16.4 updates the packaging toolchain.

Development

Poetry moves to the 1.2 series

The project updates from Poetry 1.1.x to Poetry 1.2.x.

libvcs 0.16.3 (2022-09-18)

libvcs 0.16.3 improves QueryList object handling, adds pytest-plugin coverage, and speeds up CI.

Fixes

QueryList object lookups work correctly (#415)

{class}~libvcs._internal.query_list.QueryList supports lookups against object attributes, with docs showing deeper lookup paths through keygetter and parse_lookup.

Documentation

QueryList examples cover object lookups (#415)

The docs gain examples for deep object lookups through query-list helpers.

Development

pytest plugin and QueryList tests expand (#413, #414)

The release adds a basic pytest-plugin test and object-lookup tests for QueryList.

CI avoids unnecessary work (#416)

CI avoids fetching unused apt packages, isolates release image pulls to release jobs, and cleans up CodeQL setup.

libvcs 0.16.2 (2022-09-11)

libvcs 0.16.2 removes a temporary dependency.

Fixes

Faker is no longer required (#412)

The pytest plugin no longer needs Faker as a runtime dependency.

libvcs 0.16.1 (2022-09-11)

libvcs 0.16.1 temporarily adds a missing dependency needed by the pytest plugin.

Fixes

Faker is added as a short-term dependency (#411)

Faker is added while the fixture implementation is adjusted to avoid needing it long term.

libvcs 0.16.0 (2022-09-11)

libvcs 0.16.0 introduces the pytest plugin for creating temporary repositories in tests.

What's new

pytest plugin creates temporary VCS repositories (#409)

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 (2022-09-11)

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.

Breaking changes

Packages and sync classes are renamed (#408)

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.

Custom filesystem helpers are deprecated or removed (#397, #399)

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.

Documentation

Changelog and API docs use gp-libs utilities (#403)

The docs move from sphinx-autoapi and sphinx-autoissues to gp-libs utilities for linkified issues and stable autodoc table-of-contents behavior.

Development

Source code moves to a src/ layout (#407)

The package tree is moved under src/, and CI/configuration are updated for the new import layout.

Additional flake8 plugins are added (#379, #401, #402)

The dev lint stack adds flake8-bugbear and flake8-comprehensions.

libvcs 0.14.0 (2022-07-31)

libvcs 0.14.0 introduces the URL parser framework, reaches strict mypy compliance, and removes deprecated APIs from the 0.13 line.

Breaking changes

Deprecated shortcuts and old parser types are removed (#377, #372)

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.

Insecure or redundant Git URL schemes are removed (#379, #378, #380)

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.

GitSync(flat=...) is removed (#391)

The unused flat keyword on {class}~libvcs.sync.git.GitSync is removed. The equivalent data can be retrieved from GitRemote.to_dict().

What's new

URL parser framework (#376, #381, #384, #386)

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.

Strict mypy compliance (#390)

The codebase now passes strict mypy checks, improving the reliability of libvcs as a typed library.

Fixes

Mercurial cloning fix is backported from 0.13.1

{class}~libvcs.sync.hg.HgSync receives the Mercurial cloning fix from the 0.13.x line.

Documentation

Project branding and parser docs are refreshed

The release includes a refreshed logo and initial topic documentation for the URL parser framework.

libvcs 0.13.6 (2022-06-18)

libvcs 0.13.6 continues the transition away from public shortcut helpers.

Development

create_project moves to the internal shortcuts module

libvcs.shortcuts moves to libvcs._internal.shortcuts ahead of its public removal in 0.14.

libvcs 0.13.5 (2022-06-18)

libvcs 0.13.5 announces the shortcut deprecations that land in 0.14.

Development

Shortcut deprecations are documented

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 (2022-06-18)

libvcs 0.13.4 normalizes the VCS literal type name.

Development

VcsLiteral becomes VCSLiteral

The type alias spelling is corrected to use the all-caps VCS acronym.

libvcs 0.13.3 (2022-06-18)

libvcs 0.13.3 improves overloads for project creation.

Development

create_project() returns typed projects in overloads

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 (2022-06-12)

libvcs 0.13.2 improves Git project remote typings.

Development

Git project remote overloads are added

GitProject.remotes gains overload coverage on the 0.13.x line.

libvcs 0.13.1 (2022-06-01)

libvcs 0.13.1 fixes Mercurial cloning.

Fixes

Mercurial repositories clone correctly

Mercurial cloning works again for {class}~libvcs.sync.hg.HgSync.

libvcs 0.13.0, "Jane" (2022-05-30)

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.

Breaking changes

Command internals move under _internal (#343, #345)

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.

run() mirrors subprocess.Popen naming (#361)

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.

Sync objects use keyword-only construction (#364, #366)

Project/sync classes no longer accept positional arguments. Code should use keyword arguments such as GitSync(url="https://github.com/vcs-python/libvcs.git").

Base sync attributes are cleaned up

parent_dir is removed in favor of project.parent.path, and repo_name becomes a property.

What's new

More command wrappers land (#346, #360)

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.

Fixes

Command argument pass-through is corrected (#360, #365)

Git, SVN, and Mercurial command wrappers correctly pass argument lists through to subprocess calls, fixing cases such as git config --get color.diff.

Documentation

Developer docs cover mypy and typed helpers (#362)

Developer documentation gains mypy notes and updated examples for the lint/type-checking workflow.

Development

mypy support lands (#362)

The codebase gains basic mypy checking, type annotations for subprocess helpers, and make targets for type-checking workflows.

Subprocess helpers become dataclass-backed (#336)

{class}~libvcs._internal.subprocess.SubprocessCommand wraps subprocess calls in a dataclass so execution can be inspected, modified, mocked, and controlled.

libvcs 0.12.4 (2022-05-30)

libvcs 0.12.4 backports command argument handling fixes from 0.13.x.

Fixes

Mercurial and SVN command arguments pass through correctly (#365)

Mercurial and Subversion command wrappers no longer lose or reshape subprocess arguments incorrectly.

libvcs 0.12.3 (2022-05-28)

libvcs 0.12.3 backports Git command argument handling fixes from 0.13.x.

Fixes

Git command arguments pass through correctly (#360)

Git command wrappers correctly pass arguments such as git config --get color.diff through to subprocess.

libvcs 0.12.2 (2022-05-10)

libvcs 0.12.2 refreshes package metadata.

Development

Trove classifiers are updated

Package classifiers are updated for PyPI.

libvcs 0.12.1 (2022-05-10)

libvcs 0.12.1 marks the package as typed and improves metadata.

Development

py.typed is included

The package ships libvcs/py.typed and updates package keywords/subscription metadata.

libvcs 0.12.0, "Nimbus" (2022-04-24)

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.

Breaking changes

Repository classes become sync classes (#327, #324)

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.

Remote and logging internals are reorganized (#322, #329)

Logging helpers move onto BaseSync.log, ProjectLoggingAdapter becomes CmdLoggingAdapter, create_repo becomes create_project, and GitRemote / GitStatus move to dataclass-style objects.

What's new

Experimental command wrappers (#319)

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.

Git sync can manage configured remotes

GitSync accepts remotes during construction, and GitSync.update_repo() accepts set_remotes=True for sync flows that should reconcile remote configuration.

Dependencies

Python 3.7 and 3.8 are dropped (#308)

Maintenance and bug support for those interpreters remains on the v0.11.x branch.

Documentation

API docs split into separate pages (#321, #328)

API documentation is split by module, and sphinx-autoapi is evaluated for table-of-contents support.

Development

Release and test tooling are modernized (#303, #309, #316, #321)

The release adds CodeQL, more parametrized Git tests, CI Poetry caching, doctest support through pytest, and PyPI publication on tags.

libvcs 0.11.1 (2022-03-12)

libvcs 0.11.1 fixes CVE-2022-21187, a command-injection vulnerability in Mercurial repository URLs.

Fixes

CVE-2022-21187: Mercurial URL aliases no longer execute shell commands (#306)

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.

Documentation

Docs move to Furo

The documentation theme moves to Furo, with updated docs commands for local development.

Development

Tests move from tmp_dir to tmp_path

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, "Phebe" (2022-01-08)

libvcs 0.11.0 refreshes interpreter support and project tooling.

Dependencies

Python 3.10 is supported and Python 3.6 is dropped (#300)

The package adds Python 3.10 compatibility and removes Python 3.6 from the supported range.

Development

Poetry and pre-commit tooling are refreshed (#300)

Poetry moves from 1.1.7 to 1.1.12, and the repository adds a pre-commit configuration.

libvcs 0.10.1 (2021-11-30)

libvcs 0.10.1 fixes Git sync edge cases and refreshes Poetry.

Fixes

Remote branches are checked out before rebase (#295)

Git sync now checks out the remote branch before rebasing, with thanks to @jensens.

Pip URL revisions are handled correctly (#293)

Revision handling for pip-style URLs is fixed, with thanks to @jensens.

Development

Poetry 1.1 lockfile support is refreshed (#279)

CI uses Poetry 1.1.7 and relocks with the compatible installer.

libvcs 0.10 (2021-06-16)

libvcs 0.10 converts the changelog to Markdown.

Documentation

Changelog source moves to Markdown (#311)

The changelog is converted from its previous format to Markdown.

libvcs 0.9 (2021-06-14)

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.

Breaking changes

Repository objects require an explicit repository directory (#271)

Repository objects now require repo_dir, and libvcs.git.GitRepo.status() returns a structured status tuple.

Dependencies

Python 2.7 support is removed (#271)

The package now targets Python 3 only.

Development

Black and annotations are adopted (#271)

The codebase gains annotations and updates Black to 21.6b0.

libvcs 0.5 (2020-08-11)

libvcs 0.5 overhauls the documentation and packaging flow.

Documentation

Documentation moves to GitHub Actions and S3 (#267)

The docs are rebuilt around NumPy-style API formatting, Markdown sources, GitHub Actions deployment, S3, and CloudFront.

Development

Poetry builds and publishes packages (#270)

Package build and publication move to Poetry, and the development docs are rewritten.

libvcs 0.4.4 (2020-08-05)

libvcs 0.4.4 tightens the repository object model.

Breaking changes

BaseRepo no longer stores arbitrary kwargs (#268)

libvcs.base.BaseRepo stops assigning **kwargs directly onto the object, removes __slots__, and renames name to repo_name.

libvcs 0.4.3 (2020-08-01)

libvcs 0.4.3 fixes branch parsing in Git status output.

Fixes

Git status handles branch names with special characters

libvcs.git.extract_status() can capture branch names containing special characters.

libvcs 0.4.2 (2020-08-01)

libvcs 0.4.2 adds Git status helpers and fixes current-remote detection.

What's new

Git status returns structured information

libvcs.git.GitRepo.status() and libvcs.git.extract_status() expose structured status data from git status.

Fixes

Unpushed upstream branches no longer break remote detection

libvcs.git.GitRepo.get_current_remote_name() handles upstream branches that have not been pushed yet.

libvcs 0.4.1 (2020-08-01)

libvcs 0.4.1 removes a stray log statement.

Fixes

Debug logging noise is removed

An accidental log statement is removed.

libvcs 0.4 (2020-08-01)

libvcs 0.4 reorganizes Git remote handling to reduce implicit behavior before the 0.5 release.

Breaking changes

Git remote methods are renamed and made explicit

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.

What's new

Git repository helpers expose current remote and Git version

GitRepo.get_git_version() and GitRepo.get_current_remote_name() are added.

libvcs 0.3.3 (2020-07-29)

libvcs 0.3.3 fixes repository overwrite behavior and removes an f-string from tests.

Fixes

Git obtain can overwrite an existing remote

libvcs.git.GitRepo.obtain updates a remote when it already exists.

libvcs 0.3.2 (2020-07-26)

libvcs 0.3.2 fixes remote URL updates.

Fixes

GitRepo.remote_set() updates remote URLs correctly

libvcs.git.GitRepo.remote_set() gains an overwrite parameter for replacing existing remote URLs.

libvcs 0.3.1post1 (2020-07-26)

libvcs 0.3.1post1 fixes package metadata after 0.3.1.

Fixes

Package version metadata is corrected

The version in project metadata is fixed, and developer docs are updated.

libvcs 0.3.1 (2020-07-25)

libvcs 0.3.1 updates packaging and Python 3.8 subprocess compatibility.

Fixes

Python 3.8 subprocess warnings are fixed

The release fixes a noisy subprocess.Popen warning on Python 3.8.

Development

Packaging moves from Pipfile to Poetry (#296)

The project adopts Poetry packaging, sorts imports, adds isort configuration, and adds project URLs.

libvcs 0.3.0 (2018-03-12)

libvcs 0.3.0 moves the project under the vcs-python organization.

Fixes

VCS objects initialize correctly on Ubuntu 18.04

A platform-specific attribute assignment issue is fixed.

Development

Project metadata follows the vcs-python organization

Repository ownership and package metadata are updated for the organization move.

libvcs 0.2.3 (2016-12-22)

libvcs 0.2.3 refreshes docs links and pins older tooling.

Documentation

Documentation points to libvcs.git-pull.com

Documentation links are updated to the public docs site.

Development

Test and docs dependencies are pinned

The release pins and updates vulture, flake8, pytest-mock, pytest, and alabaster for the era's build environment.

libvcs 0.2.2 (2016-11-23)

libvcs 0.2.2 fixes a downstream vcspull integration issue.

Fixes

Unused support-module bug is fixed for vcspull

The release fixes a bug involving an unused support module, tracked downstream in vcspull#43.

libvcs 0.2.1 (2016-09-13)

libvcs 0.2.1 updates tests and missing-VCS handling.

Fixes

which() handles missing executables

The executable lookup helper now handles not-found cases and allows manual search paths.

Tests handle missing VCS binaries better

The suite improves behavior when Git or Subversion are not installed.

Development

pytest and test dependencies are refreshed

pytest moves to 3.0.2 and an unused pytest-raisesregexp dependency is removed.

libvcs 0.2.0 (2016-06-24)

libvcs 0.2.0 adds realtime progress callbacks and broader interpreter support.

What's new

Command progress callbacks stream realtime output (#9)

progress_callback can receive realtime output from long-running commands such as git fetch.

Fixes

Git update handles an unbound local path (#11)

An unbound local variable during Git updates is fixed.

Development

PyPy support and tests expand (#9)

The release adds official PyPy and PyPy3 support, along with more internal factoring and tests. Thanks to @jcfr.

libvcs 0.1.7 (2016-06-21)

libvcs 0.1.7 completes the initial removal of buffered command output.

What's new

check_returncode is available on run results

The command-run result exposes check_returncode. Thanks to @jcfr.

Fixes

Command buffering is removed

All remaining run_buffered buffering paths are removed from the library.

libvcs 0.1.6 (2016-06-21)

libvcs 0.1.6 removes colorama and library-owned logging configuration.

Breaking changes

Library logging stops configuring handlers

The package removes its logging module and leaves handler, level, formatter, and propagation choices to applications.

Development

colorama is removed

The colorama dependency is no longer needed.

libvcs 0.1.5 (2016-06-21)

libvcs 0.1.5 fixes logging adapter context.

Fixes

Repository context reaches the logging adapter

Repository context is passed through to repo logging adapters.

libvcs 0.1.4 (2016-06-20)

libvcs 0.1.4 fixes Git update progress callback signatures.

Fixes

print_stdout_on_progress_end signature matches callers

The Git update progress-end helper has the expected signature.

libvcs 0.1.3 (2016-06-20)

libvcs 0.1.3 adds a convenience repository factory.

What's new

create_repo creates VCS objects from URLs

The initial repository factory handles regular VCS URLs, and API docs are updated.

libvcs 0.1.2 (2016-06-20)

libvcs 0.1.2 adjusts constructor and pip-URL parameter names.

Breaking changes

Repository constructors use repo_dir

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 (2016-06-20)

libvcs 0.1.1 removes unused dependencies.

Development

YAML and CLI helper dependencies are dropped

Unused pyyaml, kaptan, and click dependencies are removed.

libvcs 0.1.0 (2016-06-20)

libvcs 0.1.0 is the initial standalone release split from vcspull.

What's new

libvcs becomes a standalone package

The VCS support library is split out of vcspull for independent release and reuse.