vcspull sync <name> silently matches nothing when the repository's name begins with http, git, svn, or hg. The same name resolves fine under list and search, so the config is valid — only sync can't reach it.
Reproduction
Config:
~/code/:
httpx: git+https://github.com/encode/httpx.git
flask: git+https://github.com/pallets/flask.git
list finds it:
$ vcspull list -f repro.yaml httpx
• httpx → ~/code/httpx
sync does not:
$ vcspull sync -f repro.yaml --dry-run httpx
✗ No repo found in config(s) for "httpx"
Plan: 0 to clone (+), 0 to update (~), 0 unchanged (✓), 0 blocked (⚠), 0 errors (✗)
No repositories matched the criteria.
A name without one of those prefixes works as expected:
$ vcspull sync -f repro.yaml --dry-run flask
Plan: 1 to clone (+), 0 to update (~), 0 unchanged (✓), 0 blocked (⚠), 0 errors (✗)
~/code/
+ flask ~/code/flask missing
Cause
sync classifies each positional pattern as a path, a VCS URL, or a name before handing it to filter_repos. The URL branch tests a bare prefix, so any name beginning with one of those four strings is routed to the vcs_url filter and compared against git+https://…, which never matches:
https://github.com/vcs-python/vcspull/blob/v1.65.0/src/vcspull/cli/sync.py#L1499-L1508
The prefixes are matched against the whole pattern rather than a URL scheme, so the test is true for httpx just as it is for https://….
Affected names
Any repository whose name starts with http, git, svn, or hg — for example httpx, httpie, gitui, gitleaks, gitea, hg-git. These are ordinary project names, and nothing in the config or the error message hints at why they can't be synced.
Notes
The error path is quiet about the cause: it reports the pattern as an unmatched name (No repo found in config(s) for "httpx") even though the pattern was actually interpreted as a URL. Whatever the fix, echoing back how the pattern was classified would make this class of failure self-explanatory.
Workaround: scope by workspace instead of by name, e.g. vcspull sync -w ~/code --all.
Discovered while recording CLI demos against a config containing httpx.
vcspull sync <name>silently matches nothing when the repository's name begins withhttp,git,svn, orhg. The same name resolves fine underlistandsearch, so the config is valid — onlysynccan't reach it.Reproduction
Config:
listfinds it:syncdoes not:A name without one of those prefixes works as expected:
Cause
syncclassifies each positional pattern as a path, a VCS URL, or a name before handing it tofilter_repos. The URL branch tests a bare prefix, so any name beginning with one of those four strings is routed to thevcs_urlfilter and compared againstgit+https://…, which never matches:https://github.com/vcs-python/vcspull/blob/v1.65.0/src/vcspull/cli/sync.py#L1499-L1508
The prefixes are matched against the whole pattern rather than a URL scheme, so the test is true for
httpxjust as it is forhttps://….Affected names
Any repository whose name starts with
http,git,svn, orhg— for examplehttpx,httpie,gitui,gitleaks,gitea,hg-git. These are ordinary project names, and nothing in the config or the error message hints at why they can't be synced.Notes
The error path is quiet about the cause: it reports the pattern as an unmatched name (
No repo found in config(s) for "httpx") even though the pattern was actually interpreted as a URL. Whatever the fix, echoing back how the pattern was classified would make this class of failure self-explanatory.Workaround: scope by workspace instead of by name, e.g.
vcspull sync -w ~/code --all.Discovered while recording CLI demos against a config containing
httpx.