To install the unreleased vcspull version, see developmental releases.
pip:
$ pip install --user --upgrade --pre vcspullpipx:
$ pipx install \
--suffix=@next \
--pip-args '\--pre' \
--force \
'vcspull'
// Usage: vcspull@next sync [config]uv:
$ uv add vcspull --prerelease allowuvx:
$ uvx --from 'vcspull' --prerelease allow vcspullNotes on upcoming releases will be added here
- Visual improvements to API docs from gp-sphinx-based Sphinx packages (#542)
- Bump gp-sphinx docs stack to v0.0.1a8 (#545)
Config files that are symbolic links (e.g. ~/.vcspull.yaml pointing to a
dotfiles directory) were being silently replaced by regular files on every
write, destroying the symlink. The write now goes through the link — a temp
file is created next to the real target, renamed into place, and the symlink
directory entry is preserved.
Format detection now also inspects the symlink target's extension, so a
.yaml symlink pointing to a .json file serialises correctly as JSON rather
than overwriting the target with YAML.
--sync fully reconciles your config with the remote: updates changed URLs,
and prunes entries no longer on the remote. --prune does prune-only (no URL
updates). Both respect pinned entries and use provenance tags
(metadata.imported_from) to scope pruning — manually added repos are never
removed.
$ vcspull import gh myorg \
--mode org \
--workspace ~/code/ \
--syncAvailable on all six import providers. Pruning is config-only — cloned
directories on disk are not deleted. See {ref}cli-import for details.
--prune-untracked expands --sync / --prune to also remove config
entries in the target workspace that lack import provenance — repos added
manually or before provenance tracking. Entries imported from other sources
and pinned entries are preserved. A confirmation prompt lists exactly what
would be removed.
$ vcspull import gh myorg \
--workspace ~/code/ \
--sync \
--prune-untracked \
--dry-runAny repository entry can carry an options.pin block that prevents specific
vcspull operations from mutating it. This is useful for pinned forks, company
mirrors, or any repo whose config should only be changed manually.
Pin all operations:
~/code/:
myrepo:
repo: git+git@github.com:me/myrepo.git
options:
pin: true
pin_reason: "pinned to company fork — update manually"Pin only specific operations:
~/code/:
other-repo:
repo: git+git@github.com:me/other.git
options:
pin:
import: true # --sync cannot replace this URL
fmt: true # vcspull fmt preserves the entry verbatim
pin_reason: "pinned for import and fmt"Shorthand — equivalent to pin: {import: true}:
~/code/:
shorthand-repo:
repo: git+git@github.com:me/pinned.git
options:
allow_overwrite: falsePin semantics:
pin: true— all five operations are blocked (import,add,discover,fmt,merge)pin: {op: true}— only the named operations are blocked; unspecified keys default tofalseallow_overwrite: false— concise shorthand, equivalent topin: {import: true}pin_reason— human-readable string shown in log output when a repo is skipped due to a pin
Pin awareness has been added to all config-mutation commands: import,
add, discover, fmt, and the duplicate-workspace-root merge resolver.
All three commands called save_config_yaml() unconditionally, silently
corrupting .json config files by overwriting them with YAML content. Each
save site now checks the file extension and calls the correct serialiser.
Prior to this release, GitLab's group API returned shared projects by default.
vcspull now explicitly requests with_shared=false, so shared repositories are
excluded unless --with-shared is passed.
--with-shared: Opt-in flag to include projects shared into a group from another namespace. Only applies in--mode org; a warning is emitted when used in user or search modes.--skip-group <name>: Client-side filter that excludes all repositories whose owner path contains the specified group name segment (case-insensitive, segment-based). Repeat the flag to skip multiple groups.
Previously, --limit 100 (the default) would silently discard repositories
beyond the cap with no indication that more were available.
- GitLab: Read
x-totalandx-next-pageresponse headers to detect truncation and warn users - GitHub search: Use
total_countfrom the JSON body to detect truncation - GitHub user/org: Detect mid-page limit hit as a "more available" signal
- All providers now warn when results are capped by
--limit
Rate-limited API requests previously failed immediately with an unrecoverable error. Large imports that triggered rate limits had to be manually restarted.
- Add automatic retry with exponential backoff (up to 3 attempts) on HTTP 429
- Honor the
Retry-Afterresponse header when present (capped at 120 s) - Fall back to exponential backoff with jitter when the header is absent
--limit 0 now fetches every repository instead of raising a validation
error. This follows the common CLI convention where 0 means unlimited.
GitLab ratelimit-remaining / ratelimit-limit headers are now logged
after each API request, matching the existing GitHub rate-limit logging.
A warning is emitted when fewer than 10 requests remain.
Declarative git worktree management. Configure worktrees per-repo in YAML targeting tags, branches, or commits, then list, sync, and prune them.
Configuration format:
~/repos/:
myproject:
repo: "git+https://github.com/user/project"
worktrees:
- dir: ../myproject-v1.0
tag: v1.0.0
- dir: ../myproject-dev
branch: develop
- dir: ../myproject-abc123
commit: abc123
- dir: ../myproject-stable
tag: stable
lock: true
lock_reason: "Production reference - do not remove"Each worktree entry requires a dir and exactly one ref type (tag, branch,
or commit). Optional fields: lock (boolean), lock_reason (string, implies
lock: true), and detach (boolean, defaults to true for tag/commit).
Subcommands:
Preview the plan for all configured worktrees:
$ vcspull worktree listCreate or update worktrees to match configuration:
$ vcspull worktree syncPreview sync without making changes:
$ vcspull worktree sync --dry-runRemove worktrees not present in configuration:
$ vcspull worktree prunePreview prune without removing anything:
$ vcspull worktree prune --dry-runFilter by repository name pattern:
$ vcspull worktree list "myproject"Machine-readable output:
$ vcspull worktree list --json$ vcspull worktree list --ndjsonKey features:
- Three ref types:
tag(detached HEAD),branch(tracks upstream, pulls on sync),commit(detached HEAD at exact SHA) - Path resolution: relative paths resolve from workspace root, absolute and tilde-prefixed paths are supported
- Lock support:
lock: truepasses--locktogit worktree add;lock_reasonlocks with a reason after creation - Safety: dirty worktrees are reported as BLOCKED (never force-updated), missing refs are reported as ERROR
- Plan display: entries show CREATE / UPDATE / UNCHANGED / BLOCKED / ERROR
status with colored symbols (
+,~,✓,⚠,✗) - Output modes: human-readable (default),
--json,--ndjson - Pattern filtering: all subcommands accept glob patterns to target specific repositories
Sync repositories and their worktrees in one pass with
--include-worktrees:
$ vcspull sync --all --include-worktreesPreview everything without changes:
$ vcspull sync --all \
--include-worktrees \
--dry-runWorktree results are included in the sync summary and affect the exit code
when --exit-on-error is set.
vcspull discovernow correctly distinguishes git worktrees from submodules by inspecting the.gitfile target path (#508)- Config reader: fix false duplicate-key detection in nested list mappings
inside
_DuplicateTrackingSafeLoader(#508)
- New exception hierarchy:
WorktreeErrorbase withWorktreeConfigError,WorktreeRefNotFoundError, andWorktreeDirtyErrorsubtypes (#508) WorktreeCheckaudit trail attached to every plan entry for debuggability (#508)- Comprehensive worktree test suite covering planning, sync, prune, CLI handlers, and edge cases (#508)
Import repositories from GitHub, GitLab, Codeberg/Gitea/Forgejo, and AWS CodeCommit directly into your vcspull configuration.
Import a user's repositories:
$ vcspull import github torvalds \
--workspace ~/repos/linux \
--mode userImport an organization's repositories:
$ vcspull import github django \
--workspace ~/study/python \
--mode orgSearch and import repositories:
$ vcspull import github "machine learning" \
--workspace ~/ml-repos \
--mode search \
--min-stars 1000Use with self-hosted GitLab:
$ vcspull import gitlab myuser \
--workspace ~/work \
--url https://gitlab.company.comImport from AWS CodeCommit:
$ vcspull import codecommit \
--workspace ~/work/aws \
--region us-east-1Preview without writing (dry run):
$ vcspull import codeberg user \
--workspace ~/oss \
--dry-runKey features:
- Service aliases:
gh,gl,cb,cc,aws - Filtering:
--language,--topics,--min-stars,--archived,--forks - Output modes: human-readable (default),
--json,--ndjson - Interactive confirmation before writing; use
--yes/-yto skip - Repositories already in the config are detected and skipped
- Non-zero exit code on errors (for CI/automation)
- No new dependencies (uses stdlib
urllibfor HTTP)
Clone URLs default to SSH. Use --https to get HTTPS URLs instead:
SSH (default):
$ vcspull import github torvalds \
--workspace ~/repos/linux \
--mode userUse --https for HTTPS clone URLs:
$ vcspull import github torvalds \
--workspace ~/repos/linux \
--mode user \
--httpsFor GitLab organization/group imports, subgroup namespaces are preserved under the workspace root by default:
$ vcspull import gitlab vcs-python-group-test \
--workspace ~/projects/python \
--mode orgThis writes repositories into workspace sections like:
~/projects/python/~/projects/python/<subgroup>/~/projects/python/<subgroup>/<subsubgroup>/
Use --flatten-groups to collapse subgroup repositories into a single
workspace root:
$ vcspull import gitlab vcs-python-group-test \
--workspace ~/projects/python \
--mode org \
--flatten-groups- Config writes now use atomic temp-file-then-rename to prevent data loss during interrupted writes (#510)
- Fix
pytest-asynciodeprecation warning in isolatedpytesterruns by settingasyncio_default_fixture_loop_scopeexplicitly (#515)
- Dry-run
--jsonoutput is now a flat array of plan entries, matching the schema ofsync --jsonandstatus --json(#514)
- Fix false "up to date" status for repos without upstream tracking (#514)
- Fix non-git repos being counted in dirty/clean summary totals (#514)
- Fix repos matched by multiple patterns being synced multiple times (#514)
- Fix SVN and Mercurial repos showing as BLOCKED in dry-run plan (#514)
- Fix misclassified tokens in colorized
--helpoutput (#514)
- Update sync examples in README and quickstart to use
--all(#514)
- Add SVN and Mercurial sync tests (#514)
vcspull sync without arguments now shows help instead of silently
exiting. To sync every configured repository, use --all (or -a):
$ vcspull sync --all- Passing
--allwith positional patterns is an error (mutually exclusive) - The
"*"glob pattern still works as an alternative to--all
- Subcommands (
sync,search,add,discover) now print help when called without arguments (#511)
- Fix test failures in clean build environments without a global git identity (e.g. Arch Linux nspawn containers) (#513)
- Bump minimum libvcs from v0.38.6 -> v0.39.0 (#512)
vcspull sync now reports git fetch/pull failures as errors instead of
silently succeeding. The sync summary shows errored repos alongside
successful and failed counts.
When --exit-on-error is set and sync patterns match no configured
repositories, vcspull sync now exits with a non-zero status code.
- Show unmatched patterns separately from repo totals
- Omit "0 previewed" from non-dry-run summaries
- Fix path-based sync patterns showing
"None"instead of the actual search term (#512) - Fix duplicate unmatched-pattern warnings in output (#512)
- Fix missing sync summary when all patterns are unmatched (#512)
- Add errored sync, unmatched pattern, and cross-VCS regression tests (#512)
- Fix snapshot test compatibility with syrupy 4.x (#509, #503)
- Bump minimum libvcs from v0.38.3 -> v0.38.6 (#506)
- CLI reference arguments now have permalink anchors (#502)
- Fix doc build warnings from glob patterns in help text (#502)
- Fix snapshot test compatibility for downstream packaging (#504, #503)
- Bump minimum libvcs from v0.38.2 -> v0.38.3 (#505)
- Bump minimum libvcs from v0.38.1 -> v0.38.2 (#501)
- Migrate to PyPI Trusted Publisher (#492)
sphinx-argparse broke with Sphinx 9.x due to internal API changes. This release
replaces it with sphinx_argparse_neo, a local extension with better architecture.
Changes:
- Remove
sphinx-argparsedependency - Uncap
sphinxversion (now>=8instead of<9) - Add custom Pygments lexers for CLI output highlighting
- Add syntax highlighting to argparse directive HTML output
Directive options:
:no-defaults:,:no-description:,:no-epilog:,:no-choices:,:no-types:- sphinx-argparse compatibility:
nosubcommands,nodefault,nodescription,noepilog :path:for subparser navigation:mock-modules:for mocking imports during introspection
- Add
types-docutilsandtypes-Pygmentsfor type checking - Clarify CLAUDE.md import style guidelines (stdlib vs third-party)
Search across all configured repositories using ripgrep-inspired syntax with field-scoped queries, regex patterns, and flexible output formats.
Basic usage:
Search for a term across all fields:
$ vcspull search djangoSearch by repository name:
$ vcspull search "name:flask"Search by URL:
$ vcspull search "url:github.com"Key features:
- Field-scoped queries: Target specific fields with
name:,url:,path:, orvcs:prefixes - Regex patterns: Full regex support with
-i/--ignore-case,-S/--smart-case,-F/--fixed-strings, and--word-regexp - Boolean logic: AND (default), OR (
--any), and inverted matching (-v/--invert-match) - Context display: Show matching fields with
--fieldfiltering - Output formats: Human-readable (default),
--json, or--ndjsonfor automation - Color control:
--color {auto,always,never}withNO_COLORsupport
Advanced examples:
Case-insensitive search across all fields:
$ vcspull search -i DJANGOFind repos by VCS type:
$ vcspull search "vcs:git"Match any term (OR logic):
$ vcspull search --any flask django requestsInvert match (exclude repos):
$ vcspull search -v "url:gitlab"JSON output for scripting:
$ vcspull search --json "name:lib"- Migrate from
Makefiletojustfilefor running development tasks - Update documentation to reference
justcommands
- Migrate docs deployment to AWS OIDC authentication and AWS CLI
- Bump minimum libvcs from v0.38.0 -> v0.38.1 (#491)
- Configure
sphinx-autodoc-typehintsto prevent RST parsing conflicts with Napoleon-processed docstrings by disabling type injection into docstring bodies (always_document_param_types,typehints_document_rtype). - Suppress cosmetic forward reference warnings from TYPE_CHECKING imports.
Upcoming changes will be written here.
- Bump minimum libvcs from v0.37.0 -> v0.38.0 (#489)
Path privacy added to:
vcspull fmt: summary banners, success logs, and--alllistings cache thePrivatePathdisplay value so config paths always render as~/.vcspull.yaml.vcspull add: invalid-config errors reuse the redacted path, keeping failure logs consistent with other config operations.vcspull discover: warnings for repos without remotes and "no repos found" notices collapse their target directories viaPrivatePath.vcspull sync: human "Synced …" lines now mirror the structured JSON payloads by showing tilde-collapsed repository paths.
Writes triggered by vcspull discover now pass the config file through
PrivatePath, so confirmations like "✓ Successfully updated ~/.vcspull.yaml"
and dry-run notices no longer leak the absolute home directory.
Discover now inspects the config scope (user/system/project) before writing,
so user-level configs like ~/.vcspull.yaml prefer tilde-prefixed workspace
keys while project-level configs keep their relative ./ sections. Tests
cover both behaviors to guard against regressions.
- Introduced a dedicated
PrivatePathhelper for all CLI logging and structured output, ensuring tilde-collapsed paths stay consistent without duplicating the contraction logic across commands.
- v1.46.0 shipped with v1.45.0
- Path-based imports now always record their workspaces using the tilde label
unless callers explicitly pass
--workspace ./, avoiding stray top-level./sections. - Duplicate-aware writes operate directly on the ordered loader output, keeping
repeated workspace roots intact while removing the old
config_itemsscaffolding. - CLI decisions no longer round-trip through
normalize_workspace_rootsunless duplicate merges are needed, reducing the chances of accidental YAML rewrites during--no-mergeoperations.
- Running
vcspull add ~/study/python/…from inside the workspace now logs the workspace as~/study/python/instead of./, preserving tilde-shortened labels for path-first imports.
- Duplicate workspace sections are no longer flattened when adding a repository
with
--no-merge; all previously configured repositories stay intact. - The configuration loader now exposes ordered duplicate entries so CLI writes can target the correct section without data loss.
- The CLI now requires a repository path as its positional argument, inferring
the name and
originremote automatically. Supply--urlto record an alternative remote and--namewhen you need a different label. - Workspace roots default to the checkout's parent directory; use
--workspace/--workspace-rootto override the destination while keeping the path-first flow intact. - CLI output contracts configuration paths to
~/.vcspull.yaml, keeping dry-run previews concise when configs live under the home directory.
- Discover command snapshots replace volatile line numbers with placeholders so future refactors and lint rewrites do not break the test suite.
- Running
vcspull fmtnow consolidates repeated workspace sections into one merged block so no repositories vanish during cleanup; pass--no-mergeif you want the command to surface duplicates without rewriting them.
- Default behavior now merges duplicate workspace roots so prior entries stay
intact; add
--no-mergeto keep the raw sections and handle them yourself. - You can invoke
vcspull add ~/study/python/project; the command inspects the path, auto-fills theoriginremote, shows the tilde-shortened workspace, and asks for confirmation unless you supply--yes. - CLI previews now contract
$HOMEto~/…, matching the rest of the UX.
- Running
vcspull discover --no-mergeonly reports duplicates—it leaves the file untouched until you decide to act.
- Commands backed by
load_configs(list,status,sync, etc.) automatically keep every repository even when workspace sections repeat; passmerge_duplicates=Falseto fall back to the legacy "last entry wins" behavior with a warning.
- Formatter scenarios are checked against Syrupy JSON/YAML snapshots, making it obvious when future changes alter the merged output or log text.
- Parameterized pytest scenarios cover interactive prompts, duplicate merging, and path inference to keep the redesigned workflow stable.
-
Bump minimum libvcs from v0.36.0 -> v0.37.0
-
Drop support for Python 3.9; the new minimum is Python 3.10 (#478)
See also:
All commands (list, status, sync) now contract home directory paths in JSON/NDJSON output for consistency, privacy, and portability.
Before:
{
"name": "flask",
"path": "/home/username/code/flask",
"workspace_root": "~/code/"
}After:
{
"name": "flask",
"path": "~/code/flask",
"workspace_root": "~/code/"
}Why: The workspace_root field already used tilde notation in JSON output, creating an inconsistency. Full home paths (/home/username/) expose usernames and make output less portable between machines.
Impact: Automation consuming JSON/NDJSON output will need to expand ~ to absolute paths if required. Most tools handle tilde expansion automatically.
-
Defer imports of
ConfigDicttoTYPE_CHECKINGblocks so CLI modules never importtyping_extensionsat runtime (#476).vcspull treats
typing-extensionsas a dev-only dependency, so avoiding those imports fixes crashes when the package isn’t installed in production environments and still keeps type information intact for static analysis.
vcspull status: Now checks repositories concurrently using asyncio- Dramatically faster when checking many repositories (5-10x speedup for 20+ repos)
- Live progress display on TTY:
Progress: 5/10 ✓:3 ✗:2 - New
--max-concurrent Nflag to control concurrency limit (default: 32) - New
--no-concurrent/--sequentialflag to disable concurrent mode - Duration tracking included in JSON/NDJSON output (
duration_msfield) - Uses same asyncio pattern as
vcspull sync --dry-run - Backward compatible with sequential fallback option
- Human-readable output: Contract
$HOMEto~/in introspection commandsvcspull list,vcspull status, andvcspull sync --dry-runnow display paths like~/code/flaskinstead of/home/username/code/flask- Reduces verbosity and avoids exposing usernames in terminal output
- JSON/NDJSON output preserves full absolute paths for accuracy in automation
- Documentation: Updated all examples to use
~/for consistency
This release modernizes the vcspull CLI to align with DevOps tool conventions (Terraform, Cargo, Ruff, Biome). This is a breaking change release.
- REMOVED:
vcspull importcommand- Replaced by
vcspull add <name> <url>to add a single repository - Replaced by
vcspull discover <path>to scan and add multiple repositories
- Replaced by
- NEW:
vcspull list- List configured repositories with optional--tree,--json,--ndjsonoutput - NEW:
vcspull status- Check repository health (clean/dirty status, ahead/behind tracking with--detailed)
- RENAMED:
-c/--config→-f/--file(all commands) - NEW:
-w/--workspace/--workspace-root- All three aliases supported for workspace root - NEW:
--dry-run/-n- Preview changes without making modifications (sync, add, discover) - NEW:
--json/--ndjson- Machine-readable output for automation (sync, list, status) - NEW:
--color {auto,always,never}- Control color output
# Old → New
vcspull import NAME URL → vcspull add NAME URL
vcspull import --scan DIR → vcspull discover DIR
vcspull sync -c FILE → vcspull sync -f FILE
vcspull sync --workspace-root PATH → vcspull sync -w PATH # (or keep long form)
vcspull fmt -c FILE → vcspull fmt -f FILE
- Action commands (
sync,add,discover) support--dry-runfor safe previewing of changes - Structured output (
--json,--ndjson) enables CI/CD integration and automation - Semantic colors with
NO_COLORenvironment variable support - Short
-wflag for workspace root reduces typing - Consistent flag naming across all commands
vcspull sync --dry-runrenders a Terraform-style plan (with live progress on TTYs) and exposes the same data via a stable JSON/NDJSON schema for automation
vcspull list- View all configured repositories--treemode groups by workspace root--json/--ndjsonfor programmatic access
vcspull status- Check repository health- Shows which repos exist, are clean/dirty, or missing
--detailedmode shows branch, ahead/behind tracking, and full paths
- Align CLI help output with CPython’s argparse theming by adding a dedicated formatter that colorizes example sections for top-level and subcommand help screens (#471).
- Expand
vcspull --helpto include additional example commands for thesync,import, andfmtsubcommands, giving users clearer quick-start guidance (#471). - Keep CLI logger discovery stable while refactoring the formatter into its own module, preventing additional loggers from surfacing in downstream tools (#471).
- Rename the import CLI flag
--base-dir-key/--dirand the related internal argument names to--workspace-root, aligning both user-facing options and implementation terminology with the workspace-root concept (#470).
- Normalize workspace roots during imports so equivalent labels (for example
~/foo,~/foo/,/home/user/foo) collapse into a single canonical entry; avoids duplicate "already added" prompts (#470). - Have
vcspull fmtapply the same normalization before formatting and writing configs, so duplicate workspace-root sections are removed automatically (#470).
- Expand CLI tests to cover mixed workspace-root scenarios and the formatter’s normalization behavior (#470).
- Manual import: Register a single repository with
vcspull import <name> <url>- Optional
--dir/--pathhelpers for base-directory detection
- Optional
- Filesystem scan: Discover and import existing repositories with
vcspull import --scan <dir>- Recursively scan with
--recursive/-r - Interactive confirmation prompt or
--yesfor unattended runs - Custom base directory with
--base-dir-key
- Recursively scan with
- Normalize configuration files by expanding compact entries to
{repo: ...}, sorting directories/repos, and standardizing keys; pair with--writeto persist the formatted output.
- Enhanced logging system with better CLI module propagation and StreamHandler configuration for improved output visibility in tests and CLI usage (#465).
- Add Python 3.14 to test matrix, trove classifiers (#469)
-
libvcs 0.35.1 -> 0.36.0 (#467)
Improved Git URL detection
-
libvcs 0.35.0 -> 0.35.1 (#466)
Fixes issue with console streaming output, e.g.
git cloneprogress.
Internally, this libvcs will use text=True in subprocess, and deal only with
unicode. Before this change, handling bytestrings was supported.
- Add
from __future__ import annotationsto defer annotation resolution and reduce unnecessary runtime computations during type checking. - Enable Ruff checks for PEP-compliant annotations:
For more details on PEP 563, see: https://peps.python.org/pep-0563/
Maintenance only, no bug fixes, or new features
uv is the new package and project manager for the project, replacing Poetry.
Build system moved from poetry to hatchling.
First libvcs release built with uv package and project manager. No changes to libvcs API itself.
Maintenance only, no bug fixes or new features
Added Python 3.13 to package trove classifiers and CI tests.
Faster, cached pytest fixtures. Upstream tests are 50% faster.
- https://github.com/vcs-python/libvcs/blob/v0.32.1/CHANGES#libvcs-0310-2024-10-12
- https://libvcs.git-pull.com/history.html#libvcs-0-32-1-2024-10-12
libvcs's included test fixtures beyond v0.31.0+ are 33%+ faster.
-
libvcs: 0.29.0 -> 0.30.1 (#449, #450)
AWS CodeCommit support. Example:
~/study/aws-codecommit: test: repo: "codecommit::us-east-1://test"
- Automatically linkify links that were previously only text.
-
poetry: 1.8.1 -> 1.8.2
See also: https://github.com/python-poetry/poetry/blob/1.8.2/CHANGELOG.md
-
Code quality: Use f-strings in more places (#445)
via ruff 0.4.2.
Maintenance only, no bug fixes or new features
-
Aggressive automated lint fixes via
ruff(#442)via ruff v0.3.4, all automated lint fixes, including unsafe and previews were applied:
$ ruff check --select ALL . --fix --unsafe-fixes --preview --show-fixes; ruff format .Branches were treated with:
$ git rebase \ --strategy-option=theirs \ --exec 'poetry run ruff check --select ALL . --fix --unsafe-fixes --preview --show-fixes; poetry run ruff format .; git add src tests; git commit --amend --no-edit' \ origin/master
Maintenance only, no bug fixes or new features
-
libvcs: 0.28.2 -> 0.29.0 (#443)
Internal refactorings and maintenance.
-
poetry: 1.7.1 -> 1.8.1
See also: https://github.com/python-poetry/poetry/blob/1.8.1/CHANGELOG.md
-
ruff 0.2.2 -> 0.3.0 (#441)
Related formattings. Update CI to use
ruff check .instead ofruff ..See also: https://github.com/astral-sh/ruff/blob/v0.3.0/CHANGELOG.md
-
libvcs: 0.28.0 -> 0.28.1 (#440)
Fixes
'--max-count': not an integerissue when syncing git repos.
- CI: Bump actions for Node 20 (#439)
Maintenance only, no bug fixes or new features
-
libvcs: 0.27.0 -> 0.28.0 (#437)
QueryList generic typing improvements.
Maintenance only, no bug fixes, or new features
-
libvcs: v0.26.0 -> v0.27.0 (#435)
Renamings of
dirtopath. -
Fix shadowing of python builtins
dir->path(#435)
-
Strengthen linting (#436)
-
Add flake8-commas (COM)
-
Add flake8-builtins (A)
-
Add flake8-errmsg (EM)
-
- Refactor API docs to split across multiple pages (#431)
- Remove unused reStructuredText section headers from some modules (#431)
Maintenance only, no bug fixes, or new features
- ci: Add pydocstyle rule to ruff (#428)
- Add docstrings to functions, methods, classes, and packages (#428)
- libvcs 0.25.1 -> 0.26.0: Minor bug fixes, docstring updates
- Move CodeQL from advanced configuration file to GitHub's default
- libvcs 0.25.0 -> 0.25.1 (maintenance release)
Maintenance only, no bug fixes, or new features
-
libvcs 0.24.0 -> 0.25.0 (maintenance release)
-
Add Python 3.12 to trove classifiers
-
Poetry: 1.6.x -> 1.7.0
See also: https://github.com/python-poetry/poetry/blob/1.7.0/CHANGELOG.md
-
Packaging (poetry): Fix development dependencies
Per Poetry's docs on managing dependencies and
poetry check, we had it wrong: Instead of using extras, we should create these:[tool.poetry.group.group-name.dependencies] dev-dependency = "1.0.0"
Which we now do.
-
Move formatting from
blacktoruff format(#427)This retains the same formatting style of
blackwhile eliminating a dev dependency by using our existing rust-basedrufflinter. -
CI: Update action packages to fix warnings
- dorny/paths-filter: 2.7.0 -> 2.11.1
- libvcs: Bumped from 0.22.2 -> 0.24.0 (#419)
- Git Remote URLs: Fix bug that would cause git remotes with
@to be chopped off after the protocol (#419, fixes #425)
-
Refactor of two testsuites to used
NamedTupleparametrization (#423):- test_config_variations
- test_updating_remote
Maintenance only, no bug fixes, or new features
-
Code quality improved via ruff rules (#417)
This includes fixes made by hand, and with ruff's automated fixes. With the expanded set of linting rules (which include import sorting) - ruff runs are still instant when checking the whole codebase.
Maintenance only, no bug fixes, or new features
-
Add back
blackfor formattingThis is still necessary to accompany
ruff, until it replaces black.
Maintenance only, no bug fixes or features
-
Move formatting, import sorting, and linting to ruff.
This rust-based checker has dramatically improved performance. Linting and formatting can be done almost instantly.
This change replaces black, isort, flake8 and flake8 plugins.
-
libvcs: 0.21.1 -> 0.21.2 (addition of ruff)
-
poetry: 1.4.0 -> 1.5.0
See also: https://github.com/python-poetry/poetry/releases/tag/1.5.0
- Refactor
.typesimports to not requiretyping-extensionson production builds (fixes #412 via #414, thank you for the report @Jasha10)
Maintenance only, no bug fixes or features
-
Update mypy to 1.2.0
-
libvcs: 0.21.1 -> 0.21.2
Typing update only
-
libvcs: 0.21.0 -> 0.21.1
This removes even more
typing-extensionsruntime dependencies from production builds.
-
libvcs: 0.20.0 -> 0.21.0
This removes the
typing-extensionsrequirement from production builds.
- mypy: Add
--stricttypings (#386)
-
Bump libvcs 0.19.1 -> 0.20.0
Adds python 3.11 support
Maintenance release, no features or fixes
-
Bump libvcs 0.19.0 -> 0.19.1
Doc fixes and test improvements
Maintenance release, no features or fixes
-
Bump libvcs 0.18.1 -> 0.19.0 (#408)
Refactor of sync and commands. Syncing now uses commands instead of invoking directly through
run().
Maintenance release, no features or fixes
-
sync(): Renamerepo_termstorepo_patterns(#406) -
Bump libvcs 0.17.0 to 0.18.1
- 0.18.0 includes support for URL Matcher weights
- Doc fix for sphinx-argparse CLI generation
vcspullandvcspull syncCopy updates and metavar updates (#404)
vcspull: Add usage examples to CLI output
vcspull sync: Fix showing of help when no arguments passed (#405)
-
File completions for
-c/--configfiles (#403)After updating, you can re-run shtab's setup (see completions page) completion of:
$ vcspull sync -c [tab]$ vcspull sync --config [tab]
- Fix readme example for syncing repositories
- Updates for migrations page
- Add back page on completions
- Capitalization fixes and help text updates
- Add missing pyyaml dependency (needed after #397's transition to
ConfigReader)
- Fix help text for
vcspull syncarguments and flags
Maintenance release, no features or fixes
- Move from click to {mod}
argparse(#400)
- Drop click dependency (#400)
Maintenance release, no features or fixes
-
Move test fixtures over to libvcs's pytest plugin (#398)
-
Move conftest.py to root directory (#399)
-
Add
ConfigReader: Our clean, typed parser for raw strings and files (#397)This is our shiny, new, 200-line, doctested and typed parser that replaces
kaptan.
- Drop kaptan dependency (#397)
-
Refreshed logo
-
vcspull sync:-
Empty command will now show help output
$ vcspull sync Usage: vcspull sync [OPTIONS] [REPO_TERMS]... Options: -c, --config PATH Specify config -x, --exit-on-error Exit immediately when encountering an error syncing multiple repos -h, --help Show this message and exit.
To achieve the equivalent behavior of syncing all repos, pass
'*':$ vcspull sync '*'Depending on how shell escaping works in your shell setup with wild card / asterisk, you may not need to quote
*. -
Terms with no match in config will show a notice (#394)
No repo found in config(s) for "non_existent_repo"
-
Syncing will now skip to the next repos if an error is encountered
-
Learned
--exit-on-error/-xUsage:
$ vcspull sync --exit-on-error grako djangoPrint traceback for errored repos:
$ vcspull --log-level DEBUG sync --exit-on-error grako django -
Syncing in git repositories with untracked files has been improved (via libvcs 0.17)
See also vcs-python/libvcs#425
-
-
Move to
src/directory structure (#382) -
libvcs: Update to 0.17.x (#373)
-
mypy:
- Basic mypy annotations (#373)
mypy --strictcompliant (#386)
-
Remove
.pre-commit-config.yaml: Let's not automate what the contributor could / should do themselves. -
Add flake8-bugbear (#379)
-
Add flake8-comprehensions (#380)
- Add CLI tests (#387)
- Render changelog in sphinx-autoissues (#378)
- Fix cloning of mercurial repositories
-
CI speedups (#383)
- Split out release to separate job so the PyPI Upload docker image isn't pulled on normal runs
- Clean up CodeQL
-
Upgraded poetry 1.1.x to 1.2.x
-
Remove
MANIFEST.inRedundant since poetry has pyproject.toml with
include -
Remove unused
.tmuxp-before-script.sh, which was used as abefore_scriptin.tmuxp.yaml -
Move
.coveragercintopyproject.toml(#384)
- Fix cloning of mercurial repositories (backported fix from libvcs 0.13.x)
- Update tags and description
- Update README
- Pin click at 8+
Patch branch: v1.12.x
-
Config location uses
XDG_CONFIG_HOMEfrom XDG Base Directory, (#367).Old path:
~/.vcspullNew path:
XDG_CONFIG_HOME, usually~/.config/vcspull -
Override config directory via
VCSPULL_CONFIGDIR(#367) -
Switch from
strtopathlib.Path(#364) -
Requires click 8+
-
Allow click 8.1.x (#372)
-
vcspull learned
-hfor help (thanks HN 2022-04-11) -
Python 3.7 and 3.8 dropped (#356)
Branch
v1.11.xopened for security / bug fixes. -
--versionlearned to show libvcs version -
--versionlearned to accept the-Vflag -
vcspull syncaccepts config file params via--config. Before it was only-c. Assume myrepos.yaml in your path:$ vcspull sync --config myrepos.yaml
- Publish to PyPI via CI when git tags are pushed
- Sidebar reorganized into sections
- Added documentation on fetching developmental releases of libvcs
-
vcspull syncaccepts config file params via--config. Before it was only-c. Assume myrepos.yaml in your path:$ vcspull sync --config myrepos.yaml(backport from vcspull v1.12.0b22)
- Allow click 8.1.x (backport of #372)
- vcspull learned
-hfor help (thanks HN 2022-04-11) - vcspull learned
-Vfor version - vcspull shows libvcs version with
-V/--version
- Tab-completion for repository names and configurations (retracted in v1.15)
- Update libvcs 0.11.0 -> 0.11.1 to patch CVE-2022-21187: mercurial URL injection vulnerability with URLs arguments (libvcs#306)
- Run pyupgrade formatting (#353)
- Tests: Move from pytest
tmp_dir(py.path.local) totmp_path(pathlib.Path)
- Move to furo theme
- Root:
make start_docs,make design_docs - docs/:
make start,make design
- CLI moved from
cli.py->cli/__init__.py,cli/sync.py - CLI: Default groups removed
- Updates for
vcspull syncchanged in 1.10.0
-
Sync through
vcspull syncSyncing is no longer ran by default when
vcspullis typed
-
Experimental completion (retracted in v1.15):
-
Completion for sync:
vcspull sync <tab>vcspull sync -c <tab> <tab>
-
- Added completion:
- Drop Python 3.6 (#329)
- Add Python 3.10 (#329)
✨ Renewed
-
GitLab config importer example script, credit @aschleifer (#336, #337, #341)
These are hosted on the new config generation page.
-
Rename
examplespage toconfiguration -
Theme has been moved to furo
-
Broken URLs have ben fixed
-
Added copy paste button next to code snippets
-
Inline tab examples for configuration and config generators
- CI: Use poetry 1.1.12 and new
install-poetry.pyinstall location (#329)
- Update libvcs 0.10.0 to 0.10.1
- #313: Update poetry to 1.1
- CI: Use poetry 1.1.7 and
install-poetry.pyinstaller - Relock poetry.lock at 1.1 (w/ 1.1.7's fix)
- CI: Use poetry 1.1.7 and
- #277: Convert to markdown
- Update libvcs to 0.10.0
- Fix image in README
- #308: Update to libvcs 0.9.0 (python 3.6+ only)
- Remove some python 2.7 compat imports
- #307: Drop python 2.7
- #304, #299 (tests) - Fix adding of remotes
- #303 - Overhaul docs and packaging
- #303 - Add docs for CLI via sphinx-click
- Bump libvcs to 0.4.4
- Bump libvcs to 0.4.3, fix issue with updating branches that have special characters (e.g. hyphens)
- Bump libvcs to 0.4.2, fixes issues with checking out branches where branch doesn't exist upstream
- :issue:
300Update libvcs to 0.4.0, also fixes :issue:298issue on initial checkout - :issue:
301Move from Travis to GitHub Actions
- :issue:
231Add updating / merging of remote URLs (via PR :issue:297) - Fix colorama constraint
- poetry lockfile: Fix (accidentally pushed lockfile via prerelease version of poetry)
- Fix pyproject.toml libvcs pin
- Fix pyproject.toml release version
- Fixes to contribution docs
- :issue:
257- Move from Pipfile to poetry - Removed dependency on releases for CHANGES, use plain reStructuredText for now
- Loosen constraints for colorama
- Update click to 7/8
- Add
project_urlsto setup.py
-
Sort imports
-
Add isort package, isort configuration in setup.cfg, and
make isorttask to Makefile. -
Add
make sync_pipfilefor updating Pipfile dependencies against requirements/*.txt files. -
Update Pipfile
-
Package updates
Base / Core dependencies:
- kaptan: 0.5.9 to >=0.5.9,<1 (adds Python 3.7 compatibility)
- pyyaml: >=3.12,<4 (adds Python 3.7 compatibility)
Docs:
- sphinx: 1.7.1 to 1.7.5
- alagitpull: 0.0.19 to 0.0.21
- releases: 1.4.0 to 1.7.1
Testing:
- pytest: 3.4.2 to 3.6.3
- Move to new organization, vcs-python
- Fix a bug in libvcs that prevented syncing on Ubuntu 18.04 LTS beta.
- Update libvcs to 0.3.0
- Various package updates for support infrastructure, including pytest and sphinx
- Update more documentation domain at vcspull.git-pull.com
- Update to new documentation domain at vcspull.git-pull.com
- Fix travis tests via
pip install -u mockin.travis.yaml.
- :issue:
43- fix missing test dependency on anaconda by updating libvcs - README tweaks
- :issue:
41Transition useslibvcs_ backend - :issue:
41Transition tests from unittest to pytest - :issue:
40Major API refactorings and removal of unused code, see the api reference for more. - :issue:
38Improve SVN and git support, thanks@jcfr! - :issue:
35Don't run mercurial tests ifhg(1)missing, by@jcfr - :issue:
36, :issue:37Documentation updates from@jcfr - :issue:
34Fix missing mock library, thanks@jfcr
- [cli] [internal]: command line arg parsing now uses click library.
- [cli] vcspull will use the beginning part of the argument to determine if its searching by vcs URL, repository name or system path.
- [config]
repo(the longform for the vcs url) is nowurl. - [config] [internal] repos are now passed around in a list of
:py:mod:
dict. :class:vcspull.config.expand_confighas been simplified. - [internal] flake8 and sort imports
- [internal] [dev] Add
Makefileforwatch_test(re-running tests on file change),watch_flake(re-running flake8 check on changes) - [internal] [dev] Move
.tmuxp.yamlcommands to use Makefile - [internal] [dev] split up requirements into
requirements/folder. - Drop Python 2.6 support
- [internal]
find_configrenamed tofind_config_files. - Rename
get_repostofilter_repos, simplify argument signature. - [cli] Experimental support for concurrently synchroniznig repos via
:py:mod:
multiprocessing. - [api][internal]: Refactor :class:
vcspull.repo.Repofactory class into :func:vcspull.repo.create_repo. - [internal]: major internal cleanup of dead code, pep8 style updates.
- [git] [tests]: fix git+https remotes #14, add regression tests.
- [internal]: devendorize colorama
- [internal] [tests]: handle
ERRORin git cloning, add tests. Fixes cases likeERROR: Repository not found.
- [api] Change the API of :class:
vcspull.repo.base.BaseRepoand :class:vcspull.repo.Repoto accept arguments askwargs - [api]: Rename
parent_pathtocwd. - [docs]: Pydoc documentation for
Repousage. - [docs]: Python API example
- [testing] Fix sniffer on Python 3
- [cli] remove redundant message when adding remotes
- [docs] add animated screencast preview for ReadTheDocs and README.rst
- [cli]: support for specifying for config file path with
-c. - [cli]: clarify error output when no repositories found
- [cli]: fix message when adding remotes
- [internals]: split config-related functions into
configmodule. - [tests]: consolidate tests from
testsuite.cliintotestsuite.config. - [tests]: remove stub TestSuites insite of
clitests. - [tests]: Refactor helpers. Tests should now run much faster.
- [cli]: vcspull now checks for configs in
~/.vcspull(yaml and json files) as well as the standard~/.vcspull.{yaml,json}files.
- [internals]: move to
__about__.pyconvention for pulling package data. - [internals]: remove extraneous url from stdout in git repositories.
- [dev]: support for tmuxp
before_scriptto set up local virtualenv + dependencies. - [dev]: Clean up
__init__.pyimports - [internals]: move :meth:
updateto :meth:update_dictinutils. - [cli]:
-d/--dirmatchfor matching directories, accepts fnmatch's. - [cli]:
-r/--repomatchfor matching directories, accepts fnmatch's. - [cli]:
-c/--configYAML / JSON file of repositories - [config/vcs]: Exception for private / ssh GitHub repository URLs and message to change to correct format.
- [docs]: Update docs to reflect updates on new commands and how to clone private / privileged GitHub repos.
- [cli] Update documentation when no config found to show
yamlandjson. Remove mentioning ofconf.
- [logging] #6 - fix issue where log templates would not concatenate correctly.
- [packaging] Fix issue where
package_metadata.pymissing fromMANIFEST.in.
- [setup.py] remove history from readme
- Use werkzeug/flask style unit test suites.
- [docs] Fix section headings.
- [internals] use conventions from tony/cookiecutter-pypackage.
vcspull 0.0.7 (2014-01-07)
- New logging system from pypa/pip with support showing current stderr (checkout, pull, cloning) progress.
unicode_literals,__future__for python 3 support.
- Renamed to
vcspull.
- [tests] tests for loading multiple configs, config conflict cases
- [internal] fix recursive imports, using explicit importing
- [git] handle cli case where git is on a different branch, just fetch repo.
- [py3] python 3 support
- [svn] [git] [hg] added functionality for pip's netloc and vcs functionality.
- [docs] update license docs for methods from salt (apache) and pip (mit).
- [cli] autocomplete
- [config] [tests] Support for expanding environment variables in syntax
with
${envvar}and~. - [cli] Exit with
Ctrl-Cgracefully.
- [docs] [examples] more docs and examples
- [internal] remove developer logger message that would show when updating.
- [cli] - fixed bug where logger would output message twice
- [
pep257] [pep8] [logger] updatevcspull.logmodule to latest code (fromtmuxp_ project).
- [tests] Move tests for making directory paths to
test_repoTestSuite. - [tests] [git] more work on remotes with :class:
vcspull.repo.git.GitRepo.
- [tests] refactor tests modules
- [git] add some functions with saltstack to
:py:class:
vcspull.repo.git.GitRepo. - [version] reset to 0.1.0 w/o dev tag to begin releases.
- [cli] [tests] #1 for making directories recursively.
- [tests] :py:mod:
tempfile. - [cli] [config] remove .ini support
- pep257 to all modules.
- Add argcomplete
- Move in code patterns from tmuxp. New logger, setup.py, testsuite structure, etc.
- add example
- fix packaging issue, add MANIFEST.in
- bump to 0.1.1
- move to semver
- https://github.com/vcs-python/vcspull/compare/a96e723269...a5be723de5
- remove virtualenv dep [Done]
- remove pip dep [Done]
- logging for repo obtain/update/makedir/rev [Done]
- logging.notify with alternative format [Done]
- removed salt-specific code used for Popen (https://github.com/vcs-python/vcspull/commit/67dbb793e7)