# Changelog

To install the unreleased libvcs version, see [developmental releases](https://libvcs.git-pull.com/quickstart.html#developmental-releases).

[pip](https://pip.pypa.io/en/stable/):

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

[uv](https://docs.astral.sh/uv/):

```console
$ uv add libvcs --prerelease allow
```

## libvcs 0.46.x (unreleased)

<!-- KEEP THIS PLACEHOLDER - DO NOT REMOVE OR MODIFY THIS LINE -->
_Notes on the upcoming release will go here._
<!-- END PLACEHOLDER - ADD NEW CHANGELOG ENTRIES BELOW THIS LINE -->

## libvcs 0.45.1 (2026-07-11)

libvcs 0.45.1 unbreaks test suites that build their documentation before running pytest: the bundled pytest plugin no longer overrides pytest's own collection-ignore rules, so generated `_build/` output stops aborting collection. The documentation now runs every Python example as a doctest against real temporary repositories, which surfaced and corrected examples that had drifted from the API.

### Fixes

#### pytest plugin defers to pytest's collection ignores (#544)

The plugin's `pytest_ignore_collect` hook returned a verdict for every path,
overriding `--ignore`, `norecursedirs`, and `collect_ignore`. It now abstains
with `None` for paths it has no opinion on, so suites that build their docs
before running no longer abort on the generated `_build/` output.

### Documentation

#### Documentation examples now run as doctests (#540)

Every Python example under `docs/` executes against real temporary
repositories on each test run, so copied examples work as printed. The
conversion surfaced and fixed documented calls that had drifted from the
API: `git.branches.create()` and `remote.set_url()` shown positionally
where keyword arguments are required, `notes.add(object=...)` for what is
named `object_sha`, `reflog.ls(ref=...)` and `expire(ref=...)` parameters
that don't exist, `worktrees.add(branch=...)` for `new_branch`, and
{class}`~libvcs._internal.query_list.QueryList` filter examples using
attribute names the objects don't have.

#### Cross-references link objects on first mention (#540)

Documentation pages now link classes, methods, and exceptions to their API
reference the first time prose names them, and man-page citations link to
upstream documentation. The {mod}`libvcs.url.registry` guide untangles its
examples into narrated, runnable steps, and the module hub pages open with
what each layer does.

#### Quickstart now demonstrates URL parsing (#540)

The quickstart's "Basic Usage" adds a "Parse URLs" section that detects
and parses a repository URL with {class}`~libvcs.url.git.GitURL`. See
{ref}`url-parsing` for the full tour.

## libvcs 0.45.0 (2026-06-28)

libvcs 0.45.0 makes test behavior independent of execution order by removing shared state from the URL registry and the pytest fixtures. {class}`~libvcs.url.registry.VCSRegistry` now keeps its parsers per instance, so building a custom registry no longer mutates the module-level `registry`, and the `git_repo`, `hg_repo`, and `svn_repo` fixtures hand every test its own clone instead of a shared checkout — fixing cross-test state leakage for downstream test suites such as vcspull. Contributors also gain an opt-in parallel test mode via pytest-xdist.

### Fixes

#### `VCSRegistry` no longer shares parser state across instances (#539)

{class}`~libvcs.url.registry.VCSRegistry` kept its parser map in a class
variable, so constructing any second registry mutated the shared
{data}`~libvcs.url.registry.registry`. Each registry now owns its own parser
map, leaving the global one untouched.

#### `git_repo` and `hg_repo` fixtures return isolated clones (#539)

The first consumer of the `git_repo` / `hg_repo` pytest fixtures received a live
handle to the session-cached master checkout, so mutating that checkout (adding
a remote, switching branches) polluted the cache for every later test. The
master copy is now treated as a pristine, read-only cache and every consumer —
including the first — gets its own copytree.

### Development

#### Opt-in parallel test runs (#539)

The test suite can now run in parallel via [pytest-xdist], a new development
dependency. Enable workers with `just test-parallel` or `uv run pytest -n
auto`. The plain `uv run pytest` invocation still runs serially and is
unchanged.

[pytest-xdist]: https://pytest-xdist.readthedocs.io/

## libvcs 0.44.0 (2026-06-21)

libvcs 0.44.0 returns VCS command output verbatim by default. {meth}`~libvcs.cmd.git.Git.run` and its `Hg`/`Svn` counterparts now return exactly what the VCS printed, so a captured `git diff` re-applies with `git apply` and `git cat-file blob` round-trips byte-for-byte; the previous per-line trimming corrupted whitespace-significant output. This is a breaking change — reads that want a bare value (a lone SHA, a branch name) pass the new `trim=True`. Downstream tools such as vcspull are the primary beneficiaries.

### Breaking changes

#### Command output is returned verbatim by default (#538)

`.run()` on {class}`~libvcs.cmd.git.Git`, {class}`~libvcs.cmd.hg.Hg`, and {class}`~libvcs.cmd.svn.Svn` no longer strips each line, drops blank lines, or removes the trailing newline — it returns the output unchanged.

Before, a bare value came back trimmed:

```python
sha = git.run(["rev-parse", "HEAD"])
```

After, output is verbatim; pass `trim=True` for the previous behavior:

```python
sha = git.run(["rev-parse", "HEAD"], trim=True)
```

High-level helpers are unaffected: {meth}`~libvcs.sync.git.GitSync.get_revision` still returns a bare revision.

### Fixes

- A captured `git diff` re-applies with `git apply` and `git cat-file blob` is byte-identical — leading indentation, blank lines, and the trailing newline are preserved instead of stripped (#538).
- Multi-line stderr in {exc}`~libvcs.exc.CommandError` keeps its line breaks instead of being concatenated into one run-on line (#538).
- {meth}`~libvcs.cmd.git.Git.rev_list` now honors its date-range filters (`since`, `after`, `until`, `before`, `max_age`, `min_age`); they were silently ignored before (#538).

## libvcs 0.43.0 (2026-06-20)

libvcs 0.43.0 restores compatibility with pytest 9.1. Because the pytest plugin is auto-loaded by pytest, the previous release aborted the test session for any project that had libvcs installed and upgraded to pytest 9.1+; that no longer happens. Downstream tools such as vcspull are the primary beneficiaries.

### Fixes

#### pytest 9.1 compatibility for the pytest plugin (#537)

libvcs's pytest plugin (see {ref}`pytest_plugin`) loads automatically whenever pytest runs, so any project with libvcs installed can now use pytest 9.1+ — the plugin no longer aborts the test session at startup. Its Git, Mercurial, and Subversion fixtures upgrade cleanly.

## libvcs 0.42.0 (2026-05-31)

libvcs 0.42.0 teaches {class}`~libvcs.sync.git.GitSync` to clone at an arbitrary shallow depth rather than only a single commit, so tools that synchronize many repositories can persist and apply a numeric `--depth N` instead of a boolean shallow flag. It also repairs a long-standing bug where the `git_shallow` and `tls_verify` constructor arguments were silently dropped and then raised `AttributeError` on the next {meth}`~libvcs.sync.git.GitSync.obtain`. Downstream tools such as vcspull are the primary beneficiaries.

### What's new

#### GitSync honors an arbitrary clone depth (#531)

{class}`~libvcs.sync.git.GitSync` accepts a `depth` keyword argument that {meth}`~libvcs.sync.git.GitSync.obtain` forwards to `git clone --depth N`. When `depth` is unset the prior behavior is preserved: `git_shallow=True` clones at depth 1, and otherwise the clone is full. Downstream tools can now persist and apply a numeric shallow depth instead of only a boolean shallow flag.

### Fixes

#### GitSync honors `git_shallow` and `tls_verify` constructor arguments (#531)

Passing `git_shallow=True` or `tls_verify=True` to {class}`~libvcs.sync.git.GitSync` left the matching attribute unset, so the next {meth}`~libvcs.sync.git.GitSync.obtain` raised `AttributeError`. Both are now accepted as keyword-only constructor arguments and applied when cloning.

## 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`](https://pypi.org/project/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](https://github.com/vcs-python/vcspull/pull/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.

```python
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](https://github.com/vcs-python/vcspull/issues/49) and [vcspull#426](https://github.com/vcs-python/vcspull/pull/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](https://hatch.pypa.io/latest/), 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`](https://docs.astral.sh/ruff/formatter/) 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](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-21187), with additional advisories at [NVD](https://nvd.nist.gov/vuln/detail/CVE-2022-21187) and [Snyk](https://security.snyk.io/vuln/SNYK-PYTHON-LIBVCS-2421204).

### 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](https://github.com/vcs-python/vcspull/pull/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](https://github.com/vcs-python/vcspull).

### What's new

#### libvcs becomes a standalone package

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

<!---
vim: set filetype=markdown:
-->
