# Changelog

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

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

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

[pipx](https://pypa.github.io/pipx/docs/):

```console
$ pipx install \
    --suffix=@next \
    --pip-args '\--pre' \
    --force \
    'vcspull'
```

The suffixed command is then available as `vcspull@next sync [config]`.

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

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

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

```console
$ uvx --from 'vcspull' --prerelease allow vcspull
```

## vcspull v1.66.x (unreleased)

<!-- KEEP THIS PLACEHOLDER - DO NOT REMOVE OR MODIFY THIS LINE -->
_Notes on upcoming releases will be added here_
<!-- END PLACEHOLDER - ADD NEW CHANGELOG ENTRIES BELOW THIS LINE -->

## vcspull v1.65.0 (2026-07-05)

vcspull v1.65.0 sharpens the feedback you get when a sync cannot check out
a configured branch, tag, or revision: the error now names the requested
revision, suggests how to repair the configuration, and lists the branches
Git actually reported. The release also hardens packaging by exercising the
runtime-only install path end users receive, keeping production installs
free of dev-only dependencies. Documentation is re-captured from real
command runs, with cross-links and dead links repaired throughout.

### What's new

#### Clearer branch and revision sync failures (#557)

When {ref}`cli-sync` cannot check out a configured branch, tag, or revision, the
error output now names the requested `options.rev`, suggests pinning an existing
branch or checking out a branch locally, and shows the remote branches Git
reported. This turns a low-level checkout failure into guidance for repairing
the repository configuration.

#### Runtime installs stay lean (#486)

vcspull now checks the same runtime-only install path users get from package
tools, instead of relying only on the development test environment. That keeps
production installs free of dev-only typing dependencies while still exercising
the import and CLI help paths before changes ship.

### Documentation

- Command examples are re-captured from real runs; the sync and status
  pages now show the shipped output and JSON event schema, and the front
  page's at-a-glance sync works as written.
- Commands, configuration concepts, Python modules, and external tools
  cross-link on their first mention, and every API reference page opens
  with a prose introduction ({mod}`vcspull.cli.search` now renders its
  reference, which a formatting bug previously hid).
- Broken and dead links are repaired (docs-site self-links, retired
  pip/flask/jq homes), and shell examples follow the documented console
  block conventions.

## vcspull v1.64.0 (2026-06-21)

vcspull v1.64.0 is a maintenance release that raises the libvcs floor to
v0.44.0, which returns VCS command output verbatim rather than trimming
each line. The change lives below vcspull's high-level sync helpers, so
the release brings no configuration or CLI changes.

### Dependencies

Minimum `libvcs>=0.44.0` (was `>=0.43.0`). libvcs 0.44.0 returns VCS
command output verbatim instead of trimming each line; vcspull syncs
through libvcs's high-level helpers, which are unaffected, so there are
no configuration or CLI changes (#556).

## vcspull v1.63.0 (2026-06-20)

vcspull v1.63.0 is a maintenance release that raises the libvcs floor to
v0.43.0, picking up libvcs's pytest 9.1 compatibility fix. The bump matters
to anyone running vcspull under pytest 9.1—the previous libvcs aborted the
test session at startup—but brings no configuration or CLI changes.

### Dependencies

Minimum `libvcs>=0.43.0` (was `>=0.42.0`). libvcs 0.43.0 restores
pytest 9.1 compatibility for projects that auto-load its pytest plugin
(#555).

## vcspull v1.62.0 (2026-05-31)

vcspull v1.62.0 lets a workspace keep a small window of git history per
repository with a numeric `options.depth: N`, instead of the all-or-nothing
`shallow: true`. The per-repository sync keys—`rev`, `shallow`, and `depth`—now
live under an `options:` block, and the new `vcspull migrate` command rewrites
configs from the deprecated top-level form. The old top-level keys are still
read (with a warning on `sync`), so existing configs keep working until you
migrate.

### Breaking changes

#### Per-repository sync keys now live under `options:` (#552)

The per-repository `rev`, `shallow`, and new `depth` keys are written under an
`options:` block instead of the entry root. The top-level form that shipped in
v1.61.0 is still read, but {ref}`cli-sync` warns when it encounters it. Run
{ref}`cli-migrate` to rewrite existing configs:

```yaml
# Before
~/code/:
  flask:
    repo: git+https://github.com/pallets/flask.git
    shallow: true

# After
~/code/:
  flask:
    repo: git+https://github.com/pallets/flask.git
    options:
      shallow: true
```

### Dependencies

#### Minimum `libvcs>=0.42.0` (was `>=0.41.0`)

libvcs 0.42.0 teaches its git backend an arbitrary clone depth, which the new
`depth: N` key relies on.

### What's new

#### Numeric clone depth (#552)

A repository can keep a small window of history with `options.depth: N` (clone
with `--depth N`) instead of the all-or-nothing `shallow: true`. {ref}`cli-add`
and {ref}`cli-discover` accept `--depth N` and detect an existing checkout's
depth automatically—recording `shallow: true` for a depth-1 checkout and
`depth: N` for a deeper window. See {ref}`configuration`.

#### Migrate configs to the `options:` form (#552)

{ref}`cli-migrate` rewrites configuration files that still carry top-level
`rev`/`shallow`/`depth`, moving them under `options:`. It previews changes by
default and applies them with `--write`.

## vcspull v1.61.0 (2026-05-30)

vcspull v1.61.0 lets `add` and `discover` capture per-repository git state when
importing an existing checkout, so a config can describe a reproducible snapshot
rather than only a URL. Pin a revision with `--pin <ref>`, and an existing
shallow checkout is detected (or forced with `--shallow`) and honored on the
next `sync`.

### What's new

#### Pin a repository to a fixed ref (#551)

`vcspull add` and `vcspull discover` accept `--pin <ref>` to record a commit,
tag, or branch as a per-repository `rev:`. A later `sync` checks out that ref,
so a config can capture a reproducible snapshot instead of tracking the branch
tip. See {ref}`configuration` for the `rev:` key.

#### Detect and persist shallow clones (#550)

`add` and `discover` now notice when a checkout is shallow and record
`shallow: true`, which makes `sync` clone with `--depth 1`—saving disk and time
across large workspaces. Pass `--shallow` to force it on even for a full
checkout. See {ref}`configuration` for the `shallow:` key.

## vcspull v1.60.1 (2026-05-16)

### Development

#### Test suite works under distro relative-`PYTHONPATH` builds (#549)

Distributions that test built wheels by staging them into a directory
and pointing pytest at that directory via a relative `PYTHONPATH` entry
from the source tree (the common Arch Linux PKGBUILD pattern) can now
run vcspull's full test suite end to end.

## vcspull v1.60.0 (2026-05-18)

vcspull v1.60.0 is a maintenance release for the May 2026 docs and
test-fixture stack. It tracks libvcs's pytest fixture rename and moves the
documentation build onto the new gp-sphinx theme-asset pipeline.

### Dependencies

Minimum `libvcs>=0.41.0` (was `>=0.40.0`). This picks up libvcs's
`gitconfig` / `hgconfig` fixture rename to `vcs_gitconfig` /
`vcs_hgconfig`, avoiding collisions with the third-party
[`pytest-gitconfig`](https://pypi.org/project/pytest-gitconfig/) plugin.
(#548)

### Documentation

The docs stack moves to gp-sphinx v0.0.1a16. The site now renders through
`gp-furo-theme`, a Tailwind v4 port of Furo, with `sphinx-vite-builder`
building theme assets into released wheels. (#547)

## vcspull v1.59.0 (2026-04-25)

vcspull v1.59.0 makes {ref}`cli-sync` resilient when a repository stalls.
The command now has a per-repository deadline, visible progress, a compact
streaming output trail, and a debug log path for post-failure inspection.

### Dependencies

Minimum `libvcs>=0.40.0` (was `>=0.39.0`). vcspull relies on libvcs's
`timeout=` subprocess support and faster remote URL lookup to keep large or
ref-heavy remotes from freezing the whole batch. (#544)

### What's new

#### `vcspull sync`: Per-repo timeout (#544)

One stuck repository no longer blocks the entire sync run. Each repo gets a
10-second wall-clock deadline by default; use `--timeout SECONDS` or
`VCSPULL_SYNC_TIMEOUT_SECONDS` to tune it. Timed-out repositories appear in
the summary with a copy-pasteable rerun command.

#### `vcspull sync`: Live status while work is running (#544)

TTY runs show a spinner with the active repository name and elapsed time.
Piped output gets start lines and periodic "still syncing" heartbeats. The
indicator stays out of `--json`, `--ndjson`, and `--color=never` output so
automation remains parseable.

#### `vcspull sync`: Streaming output trail (#544)

Git progress such as fetch sources and new branch lines appears in a small
panel above the spinner, then collapses into the permanent sync line when the
repository finishes. Use `--panel-lines` or `VCSPULL_PROGRESS_LINES` to hide,
cap, or uncap the trail.

#### `vcspull sync`: Per-invocation debug log (#544)

Every sync run can write a DEBUG log under `$TMPDIR/vcspull/`, surfaced in
terminal output only when something fails or times out. Use `--log-file PATH`
to choose the path or `--no-log-file` to disable the file.

#### `vcspull sync`: Ctrl-C aborts shell chains (#544)

Interrupting `vcspull sync ~/a; vcspull sync ~/b` now stops the shell chain at
the interrupted command, matching the behavior users expect from chained
`git` commands.

#### Quieter default terminal output (#544)

libvcs progress crumbs no longer print at default verbosity. Pass `-v` for
INFO-level libvcs activity or `-vv` for DEBUG; the debug log captures DEBUG
regardless of terminal verbosity.

### Fixes

`vcspull sync` no longer hangs indefinitely on credential prompts, slow
fetches, or ref-heavy remotes. (#544)

### Documentation

API pages gained visual improvements from the gp-sphinx documentation stack,
and the docs pins were refreshed through gp-sphinx v0.0.1a8. (#542, #545)

## vcspull v1.58.1 (2026-03-29)

vcspull v1.58.1 protects symlinked config files during writes. This matters
for dotfiles-managed setups where `~/.vcspull.yaml` points at a checked-in
file elsewhere.

### Fixes

#### Config writes preserve symlinks (#538)

Writing a config file no longer replaces a symlink with a regular file. The
write follows the symlink, stages the temporary file next to the real target,
and renames it into place so the symlink directory entry survives.

Format detection also inspects the symlink target extension. A `.yaml`
symlink that points at a `.json` target now continues to serialize as JSON
instead of overwriting the target with YAML.

## vcspull v1.58.0 (2026-03-01)

vcspull v1.58.0 turns {ref}`cli-import` into a reconciliation tool, not just
an append-only importer. Imports can update changed clone URLs, prune stale
entries, tag provenance, and respect per-repository pins across config
mutation commands.

### What's new

#### `vcspull import --sync` and `--prune` (#520)

`--sync` fully reconciles a workspace with a remote source: it adds new
repositories, updates existing entries whose clone URL changed, and prunes
entries that disappeared from that same source. `--prune` performs the cleanup
side without changing URLs. Both modes preserve existing metadata such as
`options`, `remotes`, `shell_command_after`, and `worktrees`.

Pruning is config-only; cloned directories on disk are never deleted. See
{ref}`cli-import` for the detailed workflow.

#### `vcspull import --prune-untracked` (#520)

`--prune-untracked` expands `--sync` or `--prune` to remove entries in the
target workspace that do not have import provenance. It is intended for older
configs that predate provenance tracking. Entries imported from another source
and pinned entries are preserved, and the confirmation prompt lists exactly
what would be removed.

#### Import provenance via `metadata.imported_from` (#520)

Reconciled imports tag entries with their source, such as
`metadata.imported_from: "github:myorg"`. vcspull uses that tag to scope stale
entry pruning so manually added repos and repos from other services are not
removed accidentally.

#### `options.pin` mutation guards (#520)

Repository entries can now declare {ref}`config-pin` metadata to prevent
specific vcspull operations from changing them. `pin: true` blocks every
config mutation path; `pin: {import: true}` blocks only import reconciliation;
`allow_overwrite: false` remains as shorthand for `pin: {import: true}`.
`pin_reason` is shown when vcspull skips an entry because of a pin.

Pin awareness applies across `import`, `add`, `discover`, `fmt`, and duplicate
workspace-root merging.

### Fixes

`vcspull add`, `vcspull discover`, and `vcspull fmt` now preserve JSON config
format instead of unconditionally writing YAML to `.json` files. (#520)

## vcspull v1.57.0 (2026-02-22)

vcspull v1.57.0 tightens GitLab group imports. Shared projects are now
opt-in, and users can exclude whole subgroup segments during import.

### Breaking changes

GitLab group imports now explicitly request `with_shared=false`, so projects
shared into a group are excluded unless `--with-shared` is passed. This
matches the safer default for users who want the group's own repositories.
(#519)

### What's new

#### `vcspull import gitlab --with-shared` (#519)

Pass `--with-shared` in `--mode org` to include projects shared into a GitLab
group from another namespace. vcspull warns if the flag is used in modes where
GitLab does not apply it.

#### `vcspull import gitlab --skip-group` (#519)

Repeatable `--skip-group NAME` filters out repositories whose owner path
contains that group segment. Matching is case-insensitive and segment-based,
so subgroup-heavy GitLab instances can be narrowed before writing config.

## vcspull v1.56.1 (2026-02-18)

vcspull v1.56.1 makes large {ref}`cli-import` runs less surprising. It warns
when result limits truncate remote data and retries rate-limited API requests
instead of failing immediately.

### What's new

#### `vcspull import --limit 0` means unlimited (#518)

`--limit 0` now fetches every available repository instead of failing
validation, following the common CLI convention that `0` means "no limit."

#### GitLab rate-limit logging (#518)

GitLab imports now log remaining rate-limit headers after API requests and
warn when fewer than 10 requests remain, matching the existing GitHub
visibility.

### Fixes

#### Import truncation warnings (#518)

GitLab, GitHub search, and GitHub user/org imports now detect when more
repositories are available beyond the active `--limit`. vcspull warns instead
of silently dropping remote results.

#### HTTP 429 retries (#518)

Rate-limited API requests now retry with bounded exponential backoff. When a
`Retry-After` header is present, vcspull honors it up to the configured cap;
otherwise it falls back to jittered backoff.

## vcspull v1.56.0 (2026-02-15)

vcspull v1.56.0 adds declarative Git worktree management. Repositories can
declare branch, tag, or commit worktrees in config, and vcspull can list,
sync, prune, or include them in normal repository syncs.

### What's new

#### New command group: `vcspull worktree` (#508)

{ref}`cli-worktree` manages configured Git worktrees with three subcommands:
{ref}`cli-worktree-list`, {ref}`cli-worktree-sync`, and
{ref}`cli-worktree-prune`. Each worktree entry requires `dir` and exactly one
of `tag`, `branch`, or `commit`; optional `lock`, `lock_reason`, and `detach`
settings control safety and checkout behavior.

Human output shows whether each worktree will be created, updated, left
unchanged, blocked, or errored. `--json` and `--ndjson` expose the same plan
data for automation.

#### `vcspull sync --include-worktrees` (#508)

{ref}`cli-sync` can now sync repositories and then their configured worktrees
in one pass with `--include-worktrees`. Worktree results are included in the
summary and participate in `--exit-on-error`.

### Fixes

`vcspull discover` now distinguishes Git worktrees from submodules by
inspecting the `.git` file target. The duplicate-aware config reader also
stops reporting false duplicate keys inside nested list mappings. (#508)

### Development

The worktree implementation added a `WorktreeError` exception hierarchy,
plan-entry audit trails, and test coverage for planning, sync, prune, CLI
output, dirty checks, missing refs, and sync integration. (#508)

## vcspull v1.55.0 (2026-02-15)

vcspull v1.55.0 introduces the service-backed {ref}`cli-import` command.
It can discover repositories from GitHub, GitLab, Codeberg, Gitea, Forgejo,
and AWS CodeCommit, then write them into vcspull config with previews and
machine-readable output.

### What's new

#### New command: `vcspull import` (#510)

`vcspull import` supports user, organization, and search modes for supported
services. It includes service aliases (`gh`, `gl`, `cb`, `cc`, `aws`),
filters such as `--language`, `--topics`, `--min-stars`, `--archived`, and
`--forks`, and output modes for human text, JSON, and NDJSON.

The command previews changes with `--dry-run`, prompts before writing by
default, and accepts `--yes` for unattended imports.

#### SSH clone URLs by default (#510)

Imported repositories default to SSH clone URLs. Pass `--https` when a config
should record HTTPS remotes instead.

#### GitLab subgroup workspaces (#510)

GitLab group imports preserve subgroup namespaces below the chosen workspace
root by default. Pass `--flatten-groups` to place every imported repository in
one workspace section.

### Fixes

Config writes now stage through a temporary file and rename into place, reducing
the chance of data loss on interrupted writes. (#510)

### Development

The release also fixed a pytest-asyncio warning in isolated `pytester` runs by
setting the default fixture loop scope explicitly. (#515)

## vcspull v1.54.0 (2026-02-08)

vcspull v1.54.0 cleans up dry-run and status behavior after the new planning
surface landed. JSON previews now share the same flat shape as other
machine-readable commands, and several cross-VCS edge cases are corrected.

### Breaking changes

Dry-run `--json` output is now a flat array of plan entries, matching
{ref}`cli-sync` and {ref}`cli-status` JSON output. (#514)

### Fixes

- Repositories without upstream tracking no longer show a false "up to date"
  status. (#514)
- SVN and Mercurial repositories no longer appear as blocked in dry-run plans.
  (#514)
- Non-Git repositories are no longer counted in Git dirty/clean summary totals.
  (#514)
- Repositories matched by multiple patterns are synced only once. (#514)
- Colorized help output no longer misclassifies several argument tokens.
  (#514)

### Documentation

README and quickstart sync examples now use the explicit `--all` flow. (#514)

### Development

SVN and Mercurial sync regressions gained test coverage. (#514)

## vcspull v1.53.0 (2026-02-08)

vcspull v1.53.0 makes broad syncs explicit. Empty subcommands now show help,
and users choose `--all` when they intend to operate on every configured
repository.

### Breaking changes

#### `vcspull sync --all` is required for all-repo syncs (#511)

Running `vcspull sync` with no patterns now shows help instead of implicitly
targeting every repository. Use `vcspull sync --all` for the full config, or
continue using a quoted `*` glob if that is your preferred workflow.

`--all` and positional patterns are mutually exclusive.

### What's new

Subcommands such as `sync`, `search`, `add`, and `discover` now print their
own help when called without the required arguments. (#511)

## vcspull v1.52.1 (2026-02-08)

vcspull v1.52.1 is a test compatibility release for clean build
environments.

### Development

Test fixtures no longer assume a global Git identity, fixing failures in
isolated packaging environments such as Arch Linux nspawn containers. (#513)

## vcspull v1.52.0 (2026-02-07)

vcspull v1.52.0 turns failed Git sync steps into reported errors instead of
silent success. Sync summaries now distinguish successful, failed, errored,
and unmatched work.

### Dependencies

Minimum `libvcs>=0.39.0` (was `>=0.38.6`). vcspull consumes libvcs's
structured sync result model to report VCS command errors. (#512)

### What's new

#### `vcspull sync`: Errored sync reporting (#512)

Git fetch and pull failures now surface as errored repositories in the sync
summary instead of disappearing behind a successful process exit.

#### `vcspull sync --exit-on-error`: Unmatched pattern failures (#512)

When `--exit-on-error` is set, patterns that match no configured repositories
now produce a non-zero exit status.

#### Clearer sync summaries (#512)

Summaries show unmatched patterns separately from repository totals and omit
irrelevant "0 previewed" text in non-dry-run output.

### Fixes

Path-based patterns now show the actual search term instead of `None`,
unmatched warnings are no longer duplicated, and all-unmatched runs still emit
a summary. (#512)

### Development

Errored syncs, unmatched patterns, and cross-VCS sync behavior gained
regression coverage. (#512)

## vcspull v1.51.1 (2026-02-01)

vcspull v1.51.1 is a test-suite compatibility release.

### Development

Snapshot tests were updated for syrupy 4.x compatibility. (#509, #503)

## vcspull v1.51.0 (2026-01-27)

vcspull v1.51.0 refreshes the libvcs floor and improves CLI reference linking.

### Dependencies

Minimum `libvcs>=0.38.6` (was `>=0.38.3`). (#506)

### Fixes

Snapshot naming compatibility was restored for downstream packaging test
runs. (#504, #503)

### Documentation

CLI reference arguments now have stable permalink anchors, and glob-like help
text no longer produces Sphinx parsing warnings. (#502)

## vcspull v1.50.1 (2026-01-25)

vcspull v1.50.1 tracks a libvcs pytest-plugin fix needed by clean build
environments.

### Dependencies

Minimum `libvcs>=0.38.3` (was `>=0.38.2`). (#505)

## vcspull v1.50.0 (2026-01-24)

vcspull v1.50.0 modernizes release publishing and replaces the aging
Sphinx argparse integration with the local CLI documentation extension.

### Dependencies

Minimum `libvcs>=0.38.2` (was `>=0.38.1`). (#501)

### Documentation

#### CLI reference rendered by the internal argparse extension (#499)

The {ref}`cli` reference no longer depends on `sphinx-argparse`, which broke
under Sphinx 9 internals. The replacement extension renders argparse help with
vcspull-specific lexers, highlighted output, compatibility options for the old
directive spelling, and subparser navigation through `:path:`.

### Development

vcspull release publishing moved to PyPI Trusted Publisher, removing long-lived
upload tokens from the release path. (#492)

The docs tooling gained type stubs for docutils and Pygments, and local agent
rules were clarified around stdlib versus third-party import style.

## vcspull v1.49.0 (2026-01-03)

vcspull v1.49.0 adds {ref}`cli-search`, a ripgrep-style way to find
repositories across configured names, URLs, paths, and VCS types.

### What's new

#### New command: `vcspull search` (#494)

`vcspull search` supports field-scoped terms such as `name:flask`,
`url:github.com`, `path:~/work`, and `vcs:git`. Searches can use regex or
fixed strings, case-insensitive or smart-case matching, word boundaries, OR
logic via `--any`, and inverted matches via `--invert-match`.

Human output highlights matched fields; `--json` and `--ndjson` expose
scriptable results.

### Documentation

Docs deployment moved to AWS OIDC credentials, removing static deployment
secrets from the docs workflow.

### Development

The project task runner moved from `Makefile` to `justfile`, and contributor
docs now use `just` commands. (#493)

## vcspull v1.48.1 (2025-12-06)

vcspull v1.48.1 refreshes libvcs and fixes API documentation rendering.

### Dependencies

Minimum `libvcs>=0.38.1` (was `>=0.38.0`). (#491)

### Documentation

Autodoc pages no longer hit indentation errors from Napoleon-processed
docstrings. Type injection into docstring bodies was disabled where it
conflicted with parsed reStructuredText, and cosmetic forward-reference
warnings from `TYPE_CHECKING` imports were suppressed. (#490)

## vcspull v1.48.0 (2025-11-30)

vcspull v1.48.0 improves path privacy across human and structured CLI output.
Home-directory paths are consistently shortened before they reach logs,
summaries, and JSON payloads.

### Dependencies

Minimum `libvcs>=0.38.0` (was `>=0.37.0`). (#489)

### Fixes

#### Consistent home-directory redaction (#488)

`vcspull fmt`, `vcspull add`, `vcspull discover`, and `vcspull sync` now reuse
the same private-path display rules for config paths, repository paths, and
user-facing warnings. See {doc}`/internals/api/private_path` for contributor
details on the helper.

## vcspull v1.47.0 (2025-11-15)

vcspull v1.47.0 continues the path-privacy cleanup for discovery workflows and
centralizes the helper used by CLI output.

### Fixes

#### `vcspull discover`: Redacted config paths (#487)

Success messages and dry-run notices from {ref}`cli-discover` now display
home-directory config paths as `~/.vcspull.yaml` instead of leaking absolute
home paths.

#### `vcspull discover`: Scope-aware workspace labels (#487)

Discovery now considers config scope before writing. User-level configs prefer
tilde-prefixed workspace keys, while project-level configs keep relative `./`
sections.

### Development

`PrivatePath` was introduced as the shared helper for CLI path redaction,
reducing repeated home-contraction logic across commands. (#485)

## vcspull v1.46.1 (2025-11-03)

vcspull v1.46.1 fixes the version metadata from v1.46.0 and closes the last
path-first `add` edge cases from the duplicate-root work.

### Fixes

#### Correct `vcspull.__version__`

v1.46.0 shipped with the previous version string. v1.46.1 restores the package
metadata to the release version.

#### `vcspull add`: Cleaner path-first writes (#484)

Path-based adds now preserve tilde workspace labels unless the user explicitly
chooses a project-relative workspace. Duplicate-aware writes operate on the
ordered loader output, so `--no-merge` paths keep repeated workspace roots
intact without unnecessary config rewrites.

## vcspull v1.46.0 (2025-11-02)

vcspull v1.46.0 fixes a tilde-label regression in the path-first add flow.

### Fixes

`vcspull add ~/study/python/project` now records and logs the workspace as
`~/study/python/` even when run from inside that workspace, instead of
collapsing the label to `./`. (#482, #483)

## vcspull v1.45.0 (2025-11-02)

vcspull v1.45.0 protects duplicate workspace sections when users intentionally
ask `add` not to merge them.

### Fixes

`vcspull add --no-merge` no longer flattens duplicate workspace roots as a
side effect of adding a repository. Previously configured repositories remain
intact, and the loader exposes ordered duplicate entries so writes can target
the intended section. (#482)

## vcspull v1.44.0 (2025-11-02)

vcspull v1.44.0 makes {ref}`cli-add` path-first. The command can infer a
repository name and origin remote from a checkout path, while still allowing
explicit overrides.

### What's new

#### `vcspull add`: Path-first imports (#481)

`vcspull add PATH` now inspects the checkout, defaults the workspace to the
checkout parent, and records the detected `origin` remote. Use `--name`,
`--url`, and `--workspace` when inference is not what you want.

### Development

CLI snapshot tests normalize volatile log line numbers so future refactors do
not churn output snapshots unnecessarily. (#481)

## vcspull v1.43.0 (2025-11-02)

vcspull v1.43.0 improves duplicate workspace-root handling across formatting,
adding, discovery, and config loading.

### What's new

#### `vcspull fmt`: Merge duplicate workspace roots (#479)

{ref}`cli-fmt` can now consolidate repeated workspace sections into a single
merged block. Pass `--no-merge` to report duplicates without rewriting them.

#### `vcspull add`: Safer duplicate-root behavior (#480)

{ref}`cli-add` merges duplicate workspace roots by default before adding a
repository, preserving existing entries. `--no-merge` keeps raw duplicate
sections for manual handling.

#### `vcspull discover --no-merge` (#480)

{ref}`cli-discover` honors `--no-merge` by reporting duplicate workspace roots
without modifying the config.

#### Duplicate-aware config loading (#480)

Commands backed by {func}`~vcspull.config.load_configs` keep repositories from
repeated workspace sections instead of letting the last section win silently.
Callers can still opt out with `merge_duplicates=False`.

### Development

Formatter and add workflows gained snapshot and regression coverage for
duplicate merging, path inference, and interactive prompts. (#479, #480)

## vcspull v1.42.0 (2025-11-01)

vcspull v1.42.0 drops Python 3.9 and refreshes the libvcs floor.

### Breaking changes

Python 3.10 is now the minimum supported Python version. Python 3.9 reached
end-of-life, so users on 3.9 should stay on an older vcspull release or upgrade
Python. (#478)

### Dependencies

Minimum `libvcs>=0.37.0` (was `>=0.36.0`).

## vcspull v1.41.0 (2025-10-25)

vcspull v1.41.0 makes machine-readable paths more portable and private by
using tilde notation for home-directory paths.

### Breaking changes

JSON and NDJSON output from {ref}`cli-list`, {ref}`cli-status`, and
{ref}`cli-sync` now contracts home-directory paths to `~/...`. Automation that
requires absolute paths should expand `~` before use.

### Fixes

Production installs no longer import `typing_extensions` through
`ConfigDict`-only type hints. Runtime-only users can install vcspull without
the development typing dependency. (#476)

## vcspull v1.40.0 (2025-10-19)

vcspull v1.40.0 makes {ref}`cli-status` much faster on large configs by
checking repositories concurrently.

### What's new

#### Concurrent `vcspull status` (#474)

Status checks now run with asyncio concurrency by default, with a live progress
display in terminals and duration fields in JSON/NDJSON output. Use
`--max-concurrent N` to tune parallelism or `--no-concurrent` /
`--sequential` for the old sequential path.

## vcspull v1.39.1 (2025-10-19)

vcspull v1.39.1 shortens home-directory paths in human-readable introspection
output.

### What's new

{ref}`cli-list`, {ref}`cli-status`, and `vcspull sync --dry-run` now display
paths such as `~/code/flask` instead of `/home/user/code/flask` in human
output. JSON and NDJSON kept absolute paths until the v1.41.0 compatibility
change. (#473)

### Documentation

Examples were updated to prefer `~/` paths consistently.

## vcspull v1.39.0 (2025-10-19)

vcspull v1.39.0 is the major CLI shape refresh. It replaces the older import
front-end with explicit add/discover/list/status commands and aligns flags
with common DevOps CLI conventions.

### Breaking changes

#### Command split: add, discover, list, and status (#472)

The older single-repo `vcspull import` command was replaced by
`vcspull add NAME URL`, and filesystem scanning moved to
`vcspull discover PATH`. New introspection commands `vcspull list` and
`vcspull status` expose config inventory and repository health.

#### Flag modernization (#472)

`-c` / `--config` became `-f` / `--file`, workspace options gained the shorter
`-w` spelling, and action commands learned common `--dry-run`, `--json`,
`--ndjson`, and `--color {auto,always,never}` flags.

### What's new

#### Terraform-style dry-run plans (#472)

`vcspull sync --dry-run` renders a plan before mutating repositories and
exposes the same data through JSON and NDJSON.

#### New introspection commands (#472)

`vcspull list` can show flat, tree, JSON, or NDJSON views of configured repos.
`vcspull status` reports whether repositories exist, are clean or dirty, and
can include branch and ahead/behind details.

## vcspull v1.38.0 (2025-10-18)

vcspull v1.38.0 improves CLI help so new users see clearer examples and
better-colored argparse output.

### What's new

`vcspull --help` and subcommand help now include richer examples for sync,
import, and fmt. A dedicated argparse formatter colorizes example sections
while keeping CLI logger discovery stable. (#471)

## vcspull v1.37.0 (2025-10-18)

vcspull v1.37.0 standardizes user-facing import terminology around workspace
roots and fixes duplicate-root ambiguity.

### Breaking changes

The legacy import flags `--base-dir-key` / `--dir` were renamed to
`--workspace-root`, and related internal argument names moved to the same
terminology. (#470)

### Fixes

Equivalent workspace-root labels such as `~/foo`, `~/foo/`, and
`/home/user/foo` now normalize before import and format writes, avoiding
duplicate "already added" prompts and duplicate config sections. (#470)

### Development

CLI tests now cover mixed workspace-root labels and formatter normalization.
(#470)

## vcspull v1.36.0 (2025-10-18)

vcspull v1.36.0 adds the first generation of local import and formatting
commands: a single-repo/scan importer and a config normalizer.

### What's new

#### Legacy `vcspull import` and `--scan` (#465)

The legacy import command could register one repository by name and URL, or
scan a directory tree with `--scan` and optional recursion. This interface was
later replaced by the v1.39.0 add/discover split and the v1.55.0 service
import command.

#### `vcspull fmt` (#465)

`vcspull fmt` normalizes config entries by expanding compact repository values,
sorting directories and repos, and standardizing keys. Pair it with `--write`
to persist formatted output.

### Development

CLI logging was refactored for better propagation and StreamHandler behavior,
and CI gained Python 3.14 coverage and trove classifiers. (#465, #469)

## vcspull v1.35.0 (2025-09-04)

vcspull v1.35.0 is a maintenance release for libvcs URL detection updates.

### Dependencies

Minimum libvcs moved from 0.35.1 to 0.36.0, picking up improved Git URL
detection. (#467)

## vcspull v1.34.1 (2025-06-21)

vcspull v1.34.1 is a maintenance release for libvcs console streaming.

### Dependencies

Minimum libvcs moved from 0.35.0 to 0.35.1, fixing progress streaming for
commands such as `git clone`. (#466)

## vcspull v1.34.0 (2025-02-22)

vcspull v1.34.0 refreshes the libvcs floor and adopts deferred annotations
throughout the codebase.

### Dependencies

Minimum libvcs moved from 0.34.0 to 0.35.0. libvcs now uses text-mode
subprocess handling internally, so vcspull no longer depends on byte-string
subprocess compatibility. (#461)

### Development

Python files now use `from __future__ import annotations`, and Ruff checks for
modern annotation syntax were enabled. (#459)

## vcspull v1.33.0 (2024-11-23)

vcspull v1.33.0 moves project management from Poetry to uv and the build
backend from Poetry to hatchling.

### Breaking changes

Development and packaging commands now use [uv](https://github.com/astral-sh/uv)
instead of Poetry. The package build backend is hatchling, and the libvcs floor
moved to 0.34.0, the first libvcs release built by the same uv-based stack.
(#456, #457)

## vcspull v1.32.0 (2024-10-13)

vcspull v1.32.0 adds Python 3.13 support and picks up faster libvcs pytest
fixtures.

### What's new

Python 3.13 was added to package classifiers and CI coverage.

### Dependencies

Minimum libvcs moved from 0.30.1 to 0.33.0, bringing cached pytest fixtures
and faster upstream test setup. (#453)

## vcspull v1.31.0 (2024-06-18)

vcspull v1.31.0 adopts libvcs AWS CodeCommit URL support and refreshes
documentation/development tooling.

### Dependencies

Minimum libvcs moved from 0.29.0 to 0.30.1. Config entries can use AWS
CodeCommit URLs such as `codecommit::us-east-1://repo-name`. (#449, #450)

### Documentation

Links that were previously plain text are now automatically linkified.

### Development

Poetry and Ruff were refreshed, and automated f-string rewrites from Ruff
0.4.2 were applied. (#445)

## vcspull v1.30.0 (2024-03-24)

vcspull v1.30.0 is a maintenance release focused on a broad Ruff cleanup.

### Development

The codebase was reformatted and lint-fixed with an aggressive Ruff pass,
including unsafe and preview fixes, then branches were rebased through the same
formatting gate. (#442)

## vcspull v1.29.0 (2024-03-24)

vcspull v1.29.0 refreshes libvcs and the Python tooling stack.

### Dependencies

Minimum libvcs moved from 0.28.2 to 0.29.0. (#443)

### Development

Poetry moved to 1.8.1, Ruff moved to 0.3.0, and CI switched to `ruff check .`
for the newer CLI. (#441)

## vcspull v1.28.1 (2024-02-17)

vcspull v1.28.1 picks up a libvcs fix for Git revision-list arguments and
updates CI actions.

### Fixes

Minimum libvcs moved from 0.28.0 to 0.28.1, fixing a `--max-count` parsing
issue when syncing Git repositories. (#440)

### Development

CI actions were bumped for Node 20 compatibility. (#439)

## vcspull v1.28.0 (2024-02-07)

vcspull v1.28.0 is a maintenance release for libvcs QueryList typing changes.

### Dependencies

Minimum libvcs moved from 0.27.0 to 0.28.0. (#437)

## vcspull v1.27.0 (2024-02-07)

vcspull v1.27.0 follows libvcs naming cleanup and tightens linting.

### Breaking changes

The libvcs floor moved from 0.26.0 to 0.27.0, including public renames from
`dir` to `path`. vcspull mirrored the same naming direction where it shadowed
Python builtins. (#435)

### Documentation

API docs were split across multiple pages, and unused reStructuredText headers
were removed from module docs. (#431)

### Development

Ruff rule coverage expanded to include flake8-commas, flake8-builtins, and
flake8-errmsg. (#436)

## vcspull v1.26.0 (2023-12-16)

vcspull v1.26.0 is a documentation and code-style maintenance release.

### Documentation

Functions, methods, classes, and packages gained NumPy-style docstrings.
(#428)

### Development

Ruff pydocstyle rules were enabled using the NumPy convention. (#428)

## vcspull v1.25.0 (2023-11-26)

vcspull v1.25.0 refreshes dependencies and simplifies CodeQL configuration.

### Dependencies

Minimum libvcs moved from 0.25.1 to 0.26.0 for minor fixes and docstring
updates.

### Development

CodeQL moved from an advanced configuration file to GitHub's default setup.

## vcspull v1.24.1 (2023-11-24)

vcspull v1.24.1 is a libvcs maintenance bump.

### Dependencies

Minimum libvcs moved from 0.25.0 to 0.25.1.

## vcspull v1.24.0 (2023-11-19)

vcspull v1.24.0 refreshes packaging, adds Python 3.12 classifiers, and moves
formatting from Black to Ruff.

### Dependencies

Minimum libvcs moved from 0.24.0 to 0.25.0.

### Development

Python 3.12 was added to trove classifiers, Poetry moved to 1.7.0, development
dependencies were reorganized into Poetry dependency groups, formatting moved
from Black to `ruff format`, and CI actions were refreshed. (#427)

## vcspull v1.23.0 (2023-10-22)

vcspull v1.23.0 fixes Git remote URL parsing and adopts newer libvcs remote
handling.

### Dependencies

Minimum libvcs moved from 0.22.2 to 0.24.0. (#419)

### Fixes

Git remote URLs containing `@` in the authority are no longer truncated after
the protocol. (#419, fixes #425)

### Development

Two test suites were moved to `typing.NamedTuple` parametrization for clearer
fixture tables. (#423)

## vcspull v1.22.0 (2023-09-02)

vcspull v1.22.0 is a code-quality maintenance release.

### Development

Ruff rule coverage expanded, including import sorting and automated cleanup
that still runs quickly across the whole codebase. (#417)

## vcspull v1.21.1 (2023-05-28)

vcspull v1.21.1 temporarily restores Black while Ruff formatting support
matured.

### Development

Black was added back alongside Ruff for formatting coverage.

## vcspull v1.21.0 (2023-05-27)

vcspull v1.21.0 begins the move from the older Black/isort/flake8 stack toward
Ruff.

### Development

Formatting, import sorting, and linting moved to Ruff, replacing Black, isort,
flake8, and several flake8 plugins for the main quality loop. libvcs and Poetry
were refreshed as part of the same tooling pass.

## vcspull v1.20.3 (2023-05-14)

vcspull v1.20.3 removes another production dependency on typing-only packages.

### Fixes

`.types` imports no longer require `typing-extensions` in production builds.
This fixed the runtime issue reported in #412. (#414)

## vcspull v1.20.2 (2023-04-07)

vcspull v1.20.2 is a typing maintenance release.

### Development

mypy moved to 1.2.0, and libvcs moved to a typing-focused maintenance release.

## vcspull v1.20.1 (2023-03-15)

vcspull v1.20.1 continues the cleanup of typing-only runtime dependencies.

### Dependencies

Minimum libvcs moved from 0.21.0 to 0.21.1, removing more
`typing-extensions` requirements from production installs.

## vcspull v1.20.0 (2023-03-15)

vcspull v1.20.0 picks up the libvcs release that removed the production
`typing-extensions` dependency.

### Dependencies

Minimum libvcs moved from 0.20.0 to 0.21.0.

## vcspull v1.19.0 (2022-12-31)

vcspull v1.19.0 is a strict typing milestone.

### Development

The project enabled mypy strict checking. (#386)

## vcspull v1.18.0 (2022-10-31)

vcspull v1.18.0 adds Python 3.11 support through the matching libvcs release.

### Dependencies

Minimum libvcs moved from 0.19.1 to 0.20.0 for Python 3.11 support. (#409)

## vcspull v1.17.1 (2022-10-23)

vcspull v1.17.1 is a libvcs maintenance refresh.

### Dependencies

Minimum libvcs moved from 0.19.0 to 0.19.1 for documentation fixes and test
improvements.

## vcspull v1.17.0 (2022-10-23)

vcspull v1.17.0 tracks libvcs's command-based sync refactor.

### Dependencies

Minimum libvcs moved from 0.18.1 to 0.19.0. Syncing now routes through libvcs
command helpers instead of calling the lower-level runner directly. (#408)

## vcspull v1.16.0 (2022-10-23)

vcspull v1.16.0 is a small compatibility and internal naming release.

### Dependencies

Minimum libvcs moved from 0.17.0 to 0.18.1, including URL matcher weight
support.

### Development

The internal `sync()` parameter name moved from `repo_terms` to
`repo_patterns`. (#406)

## vcspull v1.15.8 (2022-10-16)

vcspull v1.15.8 fixes documentation generation for the argparse CLI.

### Documentation

The sphinx-argparse CLI generation path was corrected.

## vcspull v1.15.7 (2022-10-16)

vcspull v1.15.7 updates command help copy and metavars.

### Documentation

`vcspull` and `vcspull sync` help text received copy and metavar updates.
(#404)

## vcspull v1.15.6 (2022-10-16)

vcspull v1.15.6 adds usage examples to top-level CLI help.

### Documentation

`vcspull --help` now includes examples.

## vcspull v1.15.5 (2022-10-16)

vcspull v1.15.5 restores the no-argument help path for sync.

### Fixes

`vcspull sync` shows help when called without arguments. (#405)

## vcspull v1.15.4 (2022-10-16)

vcspull v1.15.4 improves completion and README guidance.

### What's new

Shell completion now completes config files for `-c` and `--config`, so
`vcspull sync -c <tab>` can complete YAML and JSON config paths. (#403)

### Documentation

The README sync example was corrected, and completion setup guidance was
updated.

## vcspull v1.15.3 (2022-10-09)

vcspull v1.15.3 is a CLI copy and documentation refresh.

### Documentation

Migration docs and the completion page were restored and updated.

### Development

CLI capitalization and help text were cleaned up.

## vcspull v1.15.2 (2022-10-08)

vcspull v1.15.2 fixes packaging metadata after the ConfigReader migration.

### Dependencies

PyYAML was added as an explicit dependency after the move away from kaptan.

## vcspull v1.15.1 (2022-10-02)

vcspull v1.15.1 fixes sync help text.

### Fixes

`vcspull sync` argument and flag help text was corrected.

## vcspull v1.15.0 (2022-10-02)

vcspull v1.15.0 removes click from the runtime path by moving the CLI to
argparse.

### Breaking changes

The CLI implementation moved from click to the standard-library `argparse`
module. (#400)

### Dependencies

The click dependency was dropped. (#400)

## vcspull v1.14.0 (2022-10-01)

vcspull v1.14.0 replaces kaptan with a typed config reader and consolidates
test fixtures around libvcs.

### What's new

`ConfigReader` became the raw string/file parser for config data, replacing
kaptan with a smaller typed implementation. (#397)

### Dependencies

The kaptan dependency was removed. (#397)

### Development

Test fixtures moved to libvcs's pytest plugin, and the root `conftest.py`
layout was simplified. (#398, #399)

## vcspull v1.13.0 (2022-09-25)

vcspull v1.13.0 is the post-CLI-refresh release: sync gained better failure
handling and messages, the project moved to `src/`, and the test/type
infrastructure became much stricter.

### What's new

#### `vcspull sync`: Help on empty command (#395)

`vcspull sync` now shows help when called without repository patterns. To sync
all repositories in this era of the CLI, pass a quoted `*` pattern.

#### `vcspull sync`: Notices for unmatched terms (#394)

Repository terms that match no configured repo now produce an explicit notice
instead of disappearing silently.

#### `vcspull sync`: Continue on error by default (#387)

Sync now skips to the next repository after an error. Use `--exit-on-error` /
`-x` when the first failing repo should stop the run, and DEBUG logging when a
traceback is needed.

### Fixes

Mercurial cloning was fixed, and Git repositories with untracked files synced
more reliably through the libvcs 0.17 update.

### Development

The package moved to a `src/` layout, gained basic and strict mypy coverage,
added CLI tests, moved coverage settings into `pyproject.toml`, and removed
unused project scaffolding. (#373, #378, #379, #380, #382, #383, #384, #386,
#387)

## vcspull v1.12.3 (2022-06-01)

vcspull v1.12.3 backports a Mercurial clone fix.

### Fixes

Mercurial repositories clone correctly with the libvcs 0.13.x fix backported
to the 1.12 line.

## vcspull v1.12.2 (2022-05-15)

vcspull v1.12.2 refreshes package metadata and README content.

### Documentation

README and package description metadata were updated.

## vcspull v1.12.1 (2022-05-02)

vcspull v1.12.1 keeps the Click 8 compatibility path open.

### Fixes

The Click dependency range was pinned to support Click 8 and newer behavior.

## vcspull v1.12.0 (2022-04-24)

vcspull v1.12.0 is the XDG/config compatibility release. It changes where
configs live, moves path handling to `pathlib`, and keeps a patch branch open
for older Python users.

Patch branch: [`v1.12.x`](https://github.com/vcs-python/vcspull/tree/v1.12.x)

### Breaking changes

Config discovery moved from `~/.vcspull` to the XDG base directory flow,
usually `~/.config/vcspull`, with `VCSPULL_CONFIGDIR` available as an
override. Internal path handling moved from strings to `pathlib.Path`, Click 8
became required, and Python 3.7/3.8 support was dropped. (#356, #364, #367)

### What's new

`vcspull sync` accepts config files via `--config` in addition to `-c`,
`--version` also accepts `-V`, and version output includes the libvcs version.

### Documentation

The sidebar was reorganized and developmental-release documentation was added.

### Development

Publishing to PyPI was wired to CI on pushed git tags.

## vcspull v1.11.5 (2022-04-20)

vcspull v1.11.5 backports the long-form config flag.

### What's new

`vcspull sync --config myrepos.yaml` now works on the 1.11 line, matching the
v1.12 behavior.

## vcspull v1.11.4 (2022-04-17)

vcspull v1.11.4 keeps the 1.11 line compatible with Click 8.1.

### Dependencies

Click 8.1.x is allowed. (#372)

## vcspull v1.11.3 (2022-04-11)

vcspull v1.11.3 adds common short flags for help and version output.

### What's new

`vcspull -h` shows help, and `vcspull -V` / `--version` shows both vcspull and
libvcs versions.

## vcspull v1.11.2 (2022-03-21)

vcspull v1.11.2 briefly restores tab completion for repository names and
config files.

### What's new

Repository and config tab completion returned in this release. The completion
path was later retracted in v1.15.

## vcspull v1.11.1 (2022-03-12)

vcspull v1.11.1 is a security release for Mercurial URL handling.

### Fixes

libvcs moved from 0.11.0 to 0.11.1 to patch
[CVE-2022-21187](https://nvd.nist.gov/vuln/detail/CVE-2022-21187), a
Mercurial URL argument injection vulnerability. ([libvcs#306](https://github.com/vcs-python/libvcs/pull/306))

### Documentation

Docs moved to Furo, and local docs make targets were added for normal and
design-mode builds.

### Development

Formatting was refreshed with pyupgrade, and tests moved from `tmp_dir`
(`py.path.local`) to `tmp_path` (`pathlib.Path`).

## vcspull v1.11.0 (2022-02-28)

vcspull v1.11.0 splits the CLI module by command after the sync command
became explicit.

### Development

The CLI moved from `cli.py` into `cli/__init__.py` and `cli/sync.py`, and
default command groups were removed.

### Documentation

Sync documentation was updated for the v1.10 explicit-command flow.

## vcspull v1.10.0 (2022-02-28)

vcspull v1.10.0 makes `sync` an explicit subcommand.

### Breaking changes

Typing `vcspull` alone no longer runs sync. Use `vcspull sync` for repository
synchronization.

### What's new

Experimental shell completion was added for `vcspull sync` and config-file
arguments. This completion path was later retracted in v1.15.

## vcspull v1.9.0 (2022-02-26)

vcspull v1.9.0 renews the docs and updates Python compatibility.

### Breaking changes

Python 3.6 support was dropped.

### What's new

Python 3.10 support was added, and a GitLab config-import example script was
documented on the config generation page. (#329, #336, #337, #341)

### Documentation

Docs moved to Furo, broken URLs were fixed, copy buttons were added to code
blocks, and configuration examples were reorganized.

### Development

CI moved to newer Poetry installation and caching conventions.

## vcspull v1.8.1 (2021-12-05)

vcspull v1.8.1 refreshes libvcs and Poetry 1.1 support.

### Dependencies

libvcs moved from 0.10.0 to 0.10.1, and Poetry tooling was updated to the 1.1
line. (#313)

## vcspull v1.8.0 (2021-06-16)

vcspull v1.8.0 converts project docs to Markdown and updates libvcs.

### Documentation

Documentation source moved to Markdown. (#277)

### Dependencies

libvcs moved to 0.10.0.

## vcspull v1.7.0post0 (2021-06-14)

vcspull v1.7.0post0 fixes the README image.

### Documentation

The README image path was corrected.

## vcspull v1.7.0 (2021-06-14)

vcspull v1.7.0 updates libvcs for the Python 3-only line.

### Dependencies

libvcs moved to 0.9.0, which supports Python 3.6 and newer. (#308)

## vcspull v1.6.1 (2021-06-14)

vcspull v1.6.1 removes leftover Python 2 compatibility imports.

### Development

Unused compatibility imports from the Python 2 era were removed.

## vcspull v1.6.0 (2021-06-14)

vcspull v1.6.0 drops Python 2 support.

### Breaking changes

Python 2.7 support was removed. (#307)

## vcspull v1.5.0 (2020-08-11)

vcspull v1.5.0 improves remote handling tests and refreshes docs/packaging.

### Fixes

Adding and changing remotes was fixed and covered by tests. (#299, #304)

### Documentation

Docs and packaging were overhauled, including CLI docs through sphinx-click.
(#303)

## vcspull v1.4.3 (2020-08-05)

vcspull v1.4.3 is a libvcs maintenance bump.

### Dependencies

libvcs moved to 0.4.4.

## vcspull v1.4.2 (2020-08-01)

vcspull v1.4.2 fixes branch names with special characters through libvcs.

### Fixes

libvcs moved to 0.4.3, fixing updates for branches with characters such as
hyphens.

## vcspull v1.4.1 (2020-08-01)

vcspull v1.4.1 improves checkout behavior when a local branch is missing
upstream.

### Fixes

libvcs moved to 0.4.2, fixing branch checkout behavior when the branch does
not exist upstream.

## vcspull v1.4.0 (2020-08-01)

vcspull v1.4.0 fixes initial checkout behavior and moves CI to GitHub Actions.

### Fixes

libvcs moved to 0.4.0, including a fix for initial checkout failures. (#298,
#300)

### Development

CI moved from Travis to GitHub Actions. (#301)

## vcspull v1.3.1 (2020-07-26)

vcspull v1.3.1 fixes remote URL updating and packaging constraints.

### What's new

Remote URLs can be updated and merged instead of requiring manual config
cleanup. (#231, #297)

### Fixes

The colorama constraint and accidentally pushed prerelease Poetry lockfile were
corrected.

## vcspull v1.3.0post2 (2020-07-26)

vcspull v1.3.0post2 fixes the libvcs package constraint.

### Fixes

The `pyproject.toml` libvcs pin was corrected.

## vcspull v1.3.0post1 (2020-07-26)

vcspull v1.3.0post1 fixes release metadata and contribution docs.

### Fixes

The `pyproject.toml` release version was corrected.

### Documentation

Contribution docs were updated.

## vcspull v1.3.0 (2020-07-25)

vcspull v1.3.0 moves packaging to Poetry and simplifies the changelog source.

### Breaking changes

Packaging moved from Pipfile-based metadata to Poetry. (#257)

### Documentation

The changelog stopped depending on the `releases` package and moved back to
plain reStructuredText source at the time.

### Development

Colorama constraints were loosened, click 7/8 compatibility was added, and
package project URLs were declared.

## vcspull v1.2.0 (2018-07-08)

vcspull v1.2.0 refreshes the old Pipfile-era dependency stack and import
tooling.

### Dependencies

kaptan, PyYAML, Sphinx, alagitpull, releases, and pytest were updated for the
Python 3.7-era dependency set.

### Development

isort was added with a `make isort` task, imports were sorted, and
`make sync_pipfile` was added to keep Pipfile dependencies aligned with the
requirements files.

## vcspull v1.1.0 (2018-03-11)

vcspull v1.1.0 moves the project under the `vcs-python` organization and
updates support dependencies.

### Fixes

The libvcs update fixed a sync issue on Ubuntu 18.04 LTS beta.

### Dependencies

libvcs moved to 0.3.0, with pytest and Sphinx also refreshed.

## vcspull v1.0.3 (2016-12-19)

vcspull v1.0.3 updates documentation domain references.

### Documentation

More documentation links now point at `vcspull.git-pull.com`.

## vcspull v1.0.2 (2016-12-19)

vcspull v1.0.2 completes the docs domain move and fixes Travis tests.

### Documentation

Documentation links were updated to `vcspull.git-pull.com`.

### Development

Travis was fixed by installing the missing `mock` dependency.

## vcspull v1.0.1 (2016-11-24)

vcspull v1.0.1 fixes a missing test dependency through libvcs and refreshes
README content.

### Fixes

libvcs was updated to fix the missing Anaconda test dependency. (#43)

### Documentation

README copy was updated.

## vcspull v1.0.0 (2016-09-13)

vcspull v1.0.0 is the first stable release. It moves VCS operations onto the
libvcs backend, refactors the public API, and refreshes the test stack.

### Breaking changes

vcspull now uses libvcs for backend repository operations, and a major API
cleanup removed unused legacy code. (#40, #41)

### Fixes

SVN and Git support improved, Mercurial tests skip when `hg` is unavailable,
and missing mock test dependencies were fixed. (#34, #35, #38)

### Documentation

Documentation updates landed from contributors. (#36, #37)

### Development

Tests moved from unittest to pytest. (#41)

## vcspull v0.9.0 (2016-05-26)

vcspull v0.9.0 reshapes the early CLI around click, filtering, and concurrent
sync experiments.

### Breaking changes

Config entries renamed the long-form VCS URL key from `repo` to `url`, config
filtering helpers were renamed and simplified, and Python 2.6 support was
dropped.

### What's new

The CLI learned click-based argument parsing, path/name/URL matching,
`-d`/`--dirmatch`, `-r`/`--repomatch`, explicit config files, SSH GitHub URL
guidance, and experimental multiprocessing-based sync.

### Fixes

Git HTTPS remotes gained regression coverage and fixes. (#14)

### Development

Requirements were split, Makefile watch tasks were added, and old repository
factory and dead-code paths were cleaned up.

## vcspull v0.2.2 (2015-07-10)

vcspull v0.2.2 devendorizes colorama.

### Dependencies

colorama is no longer vendored.

## vcspull v0.2.1 (2015-06-12)

vcspull v0.2.1 handles Git clone error output more cleanly.

### Fixes

Git clone failures such as `ERROR: Repository not found` are handled in tests
and output.

## vcspull v0.2.0 (2015-05-19)

vcspull v0.2.0 refactors the early repository API and expands Python API docs.

### Breaking changes

The old `BaseRepo` and `Repo` APIs switched to keyword arguments, and
`parent_path` was renamed to `cwd`.

### Documentation

Python API docs and usage examples for repositories were added.

## vcspull v0.1.1 (2015-05-09)

vcspull v0.1.1 fixes early Python 3 testing and CLI output issues.

### Fixes

The test sniffer works on Python 3, redundant add-remote output was removed,
and docs gained an animated screencast preview.

## vcspull v0.1.0 (2015-04-30)

vcspull v0.1.0 adds explicit config-file selection and clearer empty-config
errors.

### What's new

The CLI accepts `-c` for a config file path.

### Fixes

When no repositories are found, the CLI now reports the condition more clearly.

## vcspull v0.0.10 (2015-04-08)

vcspull v0.0.10 improves config discovery and cleans up tests.

### What's new

Config discovery checks `~/.vcspull` YAML/JSON files in addition to
`~/.vcspull.yaml` and `~/.vcspull.json`.

### Fixes

The add-remote message was corrected.

### Development

Config functions moved into a config module, config tests were consolidated,
stub CLI test suites were removed, and test helpers were refactored for speed.

## vcspull v0.0.9-1 (2015-03-27)

vcspull v0.0.9-1 cleans up package metadata and noisy Git output.

### Fixes

Git repository output no longer includes an extra URL on stdout.

### Development

Package metadata moved to an `__about__.py` convention.

## vcspull v0.0.9 (2015-03-25)

vcspull v0.0.9 adds early matching flags and private GitHub URL guidance.

### What's new

The CLI gained config-file selection, directory matching with `-d` /
`--dirmatch`, repository-name matching with `-r` / `--repomatch`, and SSH /
private GitHub URL handling guidance.

### Documentation

Docs were updated for the new matching commands and privileged GitHub clone
formats.

### Development

tmuxp local-environment setup, package imports, and the `update_dict` utility
were cleaned up.

## vcspull v0.0.8-4 (2014-02-06)

vcspull v0.0.8-4 corrects no-config documentation.

### Documentation

No-config help now mentions YAML and JSON instead of the old `conf` wording.

## vcspull v0.0.8-3 (2014-02-06)

vcspull v0.0.8-3 fixes log template concatenation.

### Fixes

Log format templates concatenate correctly. (#6)

## vcspull v0.0.8-2 (2014-02-05)

vcspull v0.0.8-2 fixes source distribution metadata.

### Fixes

`package_metadata.py` is included in `MANIFEST.in`.

## vcspull v0.0.8-1 (2014-02-05)

vcspull v0.0.8-1 trims the README for packaging.

### Documentation

History content was removed from the README.

## vcspull v0.0.8 (2014-02-05)

vcspull v0.0.8 refreshes the early test and project-layout conventions.

### Documentation

Section headings were fixed.

### Development

The project adopted Werkzeug/Flask-style unit test suites and cookiecutter
package conventions.

## vcspull v0.0.7 (2014-01-07)

vcspull v0.0.7 adds the early progress-aware logging system and Python 3
future imports.

### What's new

Logging can show active checkout, pull, and clone progress on stderr.

### Development

`unicode_literals` and other `__future__` imports were added for Python 3
support.

## vcspull v0.0.6 (2013-12-03)

vcspull v0.0.6 gives the project its current name.

### What's new

The package was renamed to `vcspull`.

## vcspull v0.0.5 (2013-11-28)

vcspull v0.0.5 improves multi-config loading and Git branch handling.

### Fixes

Git repositories on a different branch fetch cleanly, and recursive import
issues were fixed.

### Development

Tests were added for loading multiple configs, config conflicts, and Python 3
support.

## vcspull v0.0.4 (2013-11-25)

vcspull v0.0.4 adds the first broad VCS URL/config support.

### What's new

SVN, Git, and Mercurial support gained pip-style netloc and VCS URL handling.
Config paths support environment-variable expansion and `~`, CLI autocomplete
was added, and Ctrl-C exits gracefully.

### Documentation

License notes were updated for methods derived from Salt and pip.

## vcspull v0.0.3 (2013-11-23)

vcspull v0.0.3 expands early docs and cleans up logger behavior.

### Fixes

The CLI no longer logs messages twice, and an internal developer logger message
was removed from update output.

### Documentation

More examples and documentation were added.

### Development

The logging module was refreshed from the tmuxp project, and pep257/pep8 style
updates were applied.

## vcspull v0.0.2 (2013-11-23)

vcspull v0.0.2 continues early Git remote and path test work.

### Development

Directory path tests moved to the repository test suite, and Git remote tests
were expanded.

## vcspull v0.0.2 (2013-11-16)

vcspull v0.0.2 refactors tests and adds early Git repository helpers.

### Development

Test modules were refactored, Git repository helper code was added from
SaltStack patterns, and the release version was reset to a non-dev baseline.

## vcspull v0.0.1 (2013-11-15)

vcspull v0.0.1 removes INI config support and improves directory creation.

### Fixes

The CLI can create directories recursively. (#1)

### Development

Tests now use `tempfile`, and `.ini` config support was removed.

## vcspull v0.0.1 (2013-11-09)

vcspull v0.0.1 imports project scaffolding and completion support.

### What's new

argcomplete support was added.

### Development

The project adopted tmuxp-derived setup, logger, and test-suite patterns, with
pep257 applied across modules.

## vcspull v0.0.1 (2013-10-23)

vcspull v0.0.1 adds the first example content.

### Documentation

An example was added.

## vcspull v0.0.1 (2013-10-17)

vcspull v0.0.1 fixes an early packaging issue.

### Fixes

`MANIFEST.in` was added, and the package version was bumped.

## vcspull v0.0.1 (2013-10-08)

vcspull v0.0.1 moves versioning toward semver.

### Development

The release process adopted semantic versioning.

## vcspull v0.0.1 (2013-10-06)

vcspull v0.0.1 is the earliest recorded changelog entry for the project.

### What's new

The early implementation removed bundled virtualenv/pip dependencies, added
repository operation logging, supported alternate `logging.notify` formatting,
and removed Salt-specific subprocess code.

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