# Changelog

To install the unreleased vcspull version, see [developmental releases](https://vcspull.git-pull.com/quickstart.html#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 'vcspull' --pip-args '\--pre' --force
// Usage: vcspull@next sync [config]
```

## vcspull v1.21.x (unreleased)

- _Notes on upcoming releases will be added here_

<!-- Maintainers, insert changes / features for the next release here -->

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

## Bug fix

- Refactor `.types` imports to not require `typing-extensions` on production
  builds (fixes #412 via #414, thank you for the report @Jasha10)

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

_Maintenance only, no bug fixes or features_

### Development

- Update mypy to 1.2.0
- libvcs: 0.21.1 -> 0.21.2

  Typing update only

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

- libvcs: 0.21.0 -> 0.21.1

  This removes even more `typing-extensions` runtime dependencies from
  production builds.

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

### Bug fix

- libvcs: 0.20.0 -> 0.21.0

  This removes the `typing-extensions` requirement from production builds.

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

### Internal

- mypy: Add `--strict` typings (#386)

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

### Python 3.11 support (#409)

- Bump libvcs 0.19.1 -> 0.20.0

  Adds python 3.11 support

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

**Maintenance release, no features or fixes**

### Internal

- Bump libvcs 0.19.0 -> 0.19.1

  Doc fixes and test improvements

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

**Maintenance release, no features or fixes**

### Internal

- Bump libvcs 0.18.1 -> 0.19.0 (#408)

  Refactor of sync and commands. Syncing now uses commands instead of invoking
  directly through `run()`.

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

**Maintenance release, no features or fixes**

### Internal

- `sync()`: Rename `repo_terms` to `repo_patterns` (#406)
- Bump libvcs 0.17.0 to 0.18.1

  - 0.18.0 includes support for URL Matcher weights

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

### CLI

- Doc fix for sphinx-argparse CLI generation

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

### CLI

- `vcspull` and `vcspull sync` Copy updates and metavar updates (#404)

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

### CLI

- `vcspull`: Add usage examples to CLI output

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

### CLI

- `vcspull sync`: Fix showing of help when no arguments passed (#405)

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

### CLI

- File completions for `-c` / `--config` files (#403)

  After updating, you can re-run [shtab]'s setup (see [completions page]) completion of:

  ```console
  $ vcspull sync -c [tab]
  ```

  ```console
  $ vcspull sync --config [tab]
  ```

[completions page]: https://vcspull.git-pull.com/cli/completion.html
[shtab]: https://docs.iterative.ai/shtab/

### Documentation

- Fix readme example for syncing repositories

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

### Documentation

- Updates for migrations page
- Add back page on completions

### CLI

- Capitalization fixes and help text updates

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

### Packaging

- Add missing pyyaml dependency (needed after #397's transition to `ConfigReader`)

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

### Bug fix

- Fix help text for `vcspull sync` arguments and flags

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

**Maintenance release, no features or fixes**

### Internal

- Move from click to {mod}`argparse` (#400)

### Packaging

- Drop click dependency (#400)

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

**Maintenance release, no features or fixes**

### Internal

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

### Packaging

- Drop kaptan dependency (#397)

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

### What's new

- Refreshed logo
- `vcspull sync`:

  - Empty command will now show help output

    ```console
    $ 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 `'*'`:

    ```console
    $ vcspull sync '*'
    ```

    Depending on how shell escaping works in your shell setup with [wild card / asterisk], you may not need to quote `*`.

    [wild card / asterisk]: https://tldp.org/LDP/abs/html/special-chars.html#:~:text=wild%20card%20%5Basterisk%5D.

  - 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` / `-x`

    Usage:

    ```console
    $ vcspull sync --exit-on-error grako django
    ```

    Print traceback for errored repos:

    ```console
    $ 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 https://github.com/vcs-python/libvcs/pull/425

### Development

- Move to `src/` directory structure (#382)
- libvcs: Update to 0.17.x (#373)
- mypy:

  - Basic mypy annotations (#373)
  - [`mypy --strict`] compliant (#386)

  [`mypy --strict`]: https://mypy.readthedocs.io/en/stable/command_line.html#cmdoption-mypy-strict

- Remove `.pre-commit-config.yaml`: Let's not automate what the contributor could /
  should do themselves.
- Add [flake8-bugbear](https://github.com/PyCQA/flake8-bugbear) (#379)
- Add [flake8-comprehensions](https://github.com/adamchainz/flake8-comprehensions) (#380)

### Testing

- Add CLI tests (#387)

### Documentation

- Render changelog in sphinx-autoissues (#378)

### Bug fixes

- Fix cloning of mercurial repositories

### Infrastructure

- 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

### Packaging

- Remove `MANIFEST.in`

  Redundant since poetry has pyproject.toml with `include`

- Remove unused `.tmuxp-before-script.sh`, which was used as a `before_script`
  in `.tmuxp.yaml`
- Move `.coveragerc` into `pyproject.toml` (#384)

## vcspull 1.12.3 (2022-06-01)

### Bug fixes

- Fix cloning of mercurial repositories (backported fix from libvcs 0.13.x)

## vcspull 1.12.2 (2022-05-15)

### Packaging

- Update tags and description

### Documentation

- Update README

## vcspull 1.12.1 (2022-05-02)

### Bug fixes

- Pin [click at
  8+](https://click.palletsprojects.com/en/8.0.x/changes/#version-8-0-0)

## vcspull 1.12.0 (2022-04-24)

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

### Breaking changes

- Config location uses `XDG_CONFIG_HOME` from [XDG Base Directory],
  (#367).

  Old path: `~/.vcspull`

  New path: `XDG_CONFIG_HOME`, usually `~/.config/vcspull`

  [xdg base directory]: https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html

- Override config directory via `VCSPULL_CONFIGDIR` (#367)
- Switch from `str` to `pathlib.Path` (#364)
- Requires click 8+

### Compatibility

- Allow click 8.1.x (#372)
- vcspull learned `-h` for help (thanks HN 2022-04-11)
- Python 3.7 and 3.8 dropped (#356)

  Branch [`v1.11.x`](https://github.com/vcs-python/vcspull/tree/v1.11.x) opened for security / bug fixes.

- `--version` learned to show libvcs version
- `--version` learned to accept the `-V` flag
- `vcspull sync` accepts config file params via `--config`. Before it was only
  `-c`. Assume myrepos.yaml in your path:

  ```console
  $ vcspull sync --config myrepos.yaml
  ```

### Development

- Publish to PyPI via CI when git tags are pushed

### Documentation

- Sidebar reorganized into sections
- Added documentation on fetching developmental releases of libvcs

## vcspull 1.11.5 (2022-04-20)

### Compatibility

- `vcspull sync` accepts config file params via `--config`. Before it was only
  `-c`. Assume myrepos.yaml in your path:

  ```console
  $ vcspull sync --config myrepos.yaml
  ```

  (backport from vcspull v1.12.0b22)

## vcspull 1.11.4 (2022-04-17)

### Compatibility

- Allow click 8.1.x (backport of #372)

## vcspull 1.11.3 (2022-04-11)

### Compatibility

- vcspull learned `-h` for help (thanks HN 2022-04-11)
- vcspull learned `-V` for version
- vcspull shows libvcs version with `-V` / `--version`

## vcspull 1.11.2 (2022-03-21)

### Fix

- Tab-completion for repository names and configurations (retracted in v1.15)

## vcspull 1.11.1 (2022-03-12)

### Security

- Update libvcs 0.11.0 -> 0.11.1 to patch [CVE-2022-21187](https://nvd.nist.gov/vuln/detail/CVE-2022-21187): mercurial URL injection
  vulnerability with URLs arguments ([libvcs#306](https://github.com/vcs-python/libvcs/pull/306))

### Development

- Run pyupgrade formatting (#353)
- Tests: Move from pytest `tmp_dir` (`py.path.local`) to `tmp_path`
  (`pathlib.Path`)

### Documentation

- Move to furo theme
- Root: `make start_docs`, `make design_docs`
- docs/: `make start`, `make design`

## vcspull 1.11.0 (2022-02-28)

### Development

- CLI moved from `cli.py` -> `cli/__init__.py`, `cli/sync.py`
- CLI: Default groups removed

### Documentation

- Updates for `vcspull sync` changed in 1.10.0

## vcspull 1.10.0 (2022-02-28)

### Breaking

- Sync through `vcspull sync`

  Syncing is no longer ran by default when `vcspull` is typed

### Improvements

- Experimental completion (retracted in v1.15):

  - Completion for sync:

    - `vcspull sync <tab>`
    - `vcspull sync -c <tab> <tab>`

### Documentation

- Added completion:

## vcspull 1.9.0 (2022-02-26)

### Compatibility

- Drop Python 3.6 (#329)
- Add Python 3.10 (#329)

### Documentation

_✨ Renewed_

- GitLab config importer example script, credit @aschleifer (#336, #337, #341)

  These are hosted on the new _config generation_ page.

- Rename `examples` page to `configuration`
- 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

[furo]: https://github.com/pradyunsg/furo

### Development

- CI: Use poetry 1.1.12 and new `install-poetry.py` install location (#329)

## vcspull 1.8.1 (2021-12-05)

- Update libvcs 0.10.0 to 0.10.1
- #313: Update poetry to 1.1
  - CI: Use poetry 1.1.7 and `install-poetry.py` installer
  - Relock poetry.lock at 1.1 (w/ 1.1.7's fix)

## vcspull 1.8.0 (2021-06-16)

- #277: Convert to markdown
- Update libvcs to 0.10.0

## vcspull 1.7.0post0 (2021-06-14)

- Fix image in README

## vcspull 1.7.0 (2021-06-14)

- #308: Update to libvcs 0.9.0 (python 3.6+ only)

## vcspull 1.6.1 (2021-06-14)

- Remove some python 2.7 compat imports

## vcspull 1.6.0 (2021-06-14)

- #307: Drop python 2.7

## vcspull 1.5.0 (2020-08-11)

- #304, #299 (tests) - Fix adding of remotes
- #303 - Overhaul docs and packaging
- #303 - Add docs for CLI via sphinx-click

## vcspull 1.4.3 (2020-08-05)

- Bump libvcs to 0.4.4

## vcspull 1.4.2 (2020-08-01)

- Bump libvcs to 0.4.3, fix issue with updating branches that have special
  characters (e.g. hyphens)

## vcspull 1.4.1 (2020-08-01)

- Bump libvcs to 0.4.2, fixes issues with checking out branches where
  branch doesn't exist upstream

## vcspull 1.4.0 (2020-08-01)

- :issue:`300` Update libvcs to 0.4.0, also fixes :issue:`298` issue on initial checkout
- :issue:`301` Move from Travis to GitHub Actions

## vcspull 1.3.1 (2020-07-26)

- :issue:`231` Add updating / merging of remote URLs (via PR :issue:`297`)
- Fix colorama constraint
- poetry lockfile: Fix (accidentally pushed lockfile via prerelease
  version of poetry)

## vcspull 1.3.0post2 (2020-07-26)

- Fix pyproject.toml libvcs pin

## vcspull 1.3.0post1 (2020-07-26)

- Fix pyproject.toml release version
- Fixes to contribution docs

## vcspull 1.3.0 (2020-07-25)

- :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_urls` to setup.py

## vcspull 1.2.0 (2018-07-08)

- Sort imports
- Add isort package, isort configuration in setup.cfg, and
  `make isort` task to Makefile.
- Add `make sync_pipfile` for 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

## vcspull 1.1.0 (2018-03-11)

- 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

## vcspull 1.0.3 (2016-12-19)

- Update more documentation domain at vcspull.git-pull.com

## vcspull 1.0.2 (2016-12-19)

- Update to new documentation domain at vcspull.git-pull.com
- Fix travis tests via `pip install -u mock` in
  `.travis.yaml`.

## vcspull 1.0.1 (2016-11-24)

- :issue:`43` - fix missing test dependency on anaconda by updating libvcs
- README tweaks

## vcspull 1.0.0 (2016-09-13)

- :issue:`41` Transition uses `libvcs`\_ backend
- :issue:`41` Transition tests from unittest to pytest
- :issue:`40` Major API refactorings and removal of unused code, see the
  api reference for more.
- :issue:`38` Improve SVN and git support, thanks `@jcfr`!
- :issue:`35` Don't run mercurial tests if `hg(1)` missing, by `@jcfr`
- :issue:`36` , :issue:`37` Documentation updates from `@jcfr`
- :issue:`34` Fix missing mock library, thanks `@jfcr`

[libvcs]: https://github.com/vcs-python/libvcs

## vcspull 0.9.0 (2016-05-26)

- [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 now `url`.
- [config] [internal] repos are now passed around in a list of
  :py:mod:`dict`. :class:`vcspull.config.expand_config` has been
  simplified.
- [internal] flake8 and sort imports
- [internal] [dev] Add `Makefile` for `watch_test` (re-running
  tests on file change), `watch_flake` (re-running flake8 check
  on changes)
- [internal] [dev] Move `.tmuxp.yaml` commands to use Makefile
- [internal] [dev] split up requirements into `requirements/`
  folder.
- Drop Python 2.6 support
- [internal] `find_config` renamed to `find_config_files`.
- Rename `get_repos` to `filter_repos`, simplify argument signature.
- [cli] Experimental support for concurrently synchroniznig repos via
  :py:mod:`multiprocessing`.
- [api][internal]: Refactor :class:`vcspull.repo.Repo` factory 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.

## vcspull 0.2.2 (2015-07-10)

- [internal]: devendorize colorama

## vcspull 0.2.1 (2015-06-12)

- [internal] [tests]: handle `ERROR` in git cloning, add tests. Fixes
  cases like `ERROR: Repository not found`.

## vcspull 0.2.0 (2015-05-19)

- [api] Change the API of :class:`vcspull.repo.base.BaseRepo` and
  :class:`vcspull.repo.Repo` to accept arguments as `kwargs`
- [api]: Rename `parent_path` to `cwd`.
- [docs]: Pydoc documentation for `Repo` usage.
- [docs]: Python API example

## vcspull 0.1.1 (2015-05-09)

- [testing] Fix sniffer on Python 3
- [cli] remove redundant message when adding remotes
- [docs] add animated screencast preview for ReadTheDocs and README.rst

## vcspull 0.1.0 (2015-04-30)

- [cli]: support for specifying for config file path with `-c`.
- [cli]: clarify error output when no repositories found

## vcspull 0.0.10 (2015-04-08)

- [cli]: fix message when adding remotes
- [internals]: split config-related functions into `config` module.
- [tests]: consolidate tests from `testsuite.cli` into
  `testsuite.config`.
- [tests]: remove stub TestSuites insite of `cli` tests.
- [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.

## vcspull 0.0.9-1 (2015-03-27)

- [internals]: move to `__about__.py` convention for pulling package
  data.
- [internals]: remove extraneous url from stdout in git repositories.

## vcspull 0.0.9 (2015-03-25)

- [dev]: support for tmuxp `before_script` to set up local virtualenv +
  dependencies.
- [dev]: Clean up `__init__.py` imports
- [internals]: move :meth:`update` to :meth:`update_dict` in `utils`.
- [cli]: `-d` / `--dirmatch` for matching directories, accepts
  [fnmatch]'s.
- [cli]: `-r` / `--repomatch` for matching directories, accepts
  [fnmatch]'s.
- [cli]: `-c` / `--config` YAML / 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 / priveleged GitHub repos.

## vcspull 0.0.8-4 (2014-02-06)

- [cli] Update documentation when no config found to show `yaml` and
  `json`. Remove mentioning of `conf`.

## vcspull 0.0.8-3 (2014-02-06)

- [logging] [#6] - fix issue where log templates would not
  concatenate correctly.

[#6]: https://github.com/vcs-python/vcspull/issues/6

## vcspull 0.0.8-2 (2014-02-05)

- [packaging] Fix issue where `package_metadata.py` missing from
  `MANIFEST.in`.

## vcspull 0.0.8-1 (2014-02-05)

- [setup.py] remove history from readme

## vcspull 0.0.8 (2014-02-05)

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

## vcspull 0.0.6 (2013-12-03)

- Renamed to `vcspull`.

## vcspull 0.0.5 (2013-11-28)

- [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

## vcspull 0.0.4 (2013-11-25)

- [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-C` gracefully.

## vcspull 0.0.3 (2013-11-23)

- [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] update `vcspull.log` module to latest
  code (from `tmuxp`\_ project).

## vcspull 0.0.2 (2013-11-23)

- [tests] Move tests for making directory paths to `test_repo`
  TestSuite.
- [tests] [git] more work on remotes with :class:`vcspull.repo.git.GitRepo`.

## vcspull 0.0.2 (2013-11-16)

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

## vcspull 0.0.1 (2013-11-15)

- [cli] [tests] [#1] for making directories recursively.
- [tests] :py:mod:`tempfile`.
- [cli] [config] remove .ini support

[#1]: https://github.com/vcs-python/vcspull/issues/1

## vcspull 0.0.1 (2013-11-09)

- [pep257] to all modules.
- Add [argcomplete]
- Move in code patterns from [tmuxp]. New logger, setup.py, testsuite
  structure, etc.

## vcspull 0.0.1 (2013-10-23)

- add example

## vcspull 0.0.1 (2013-10-17)

- fix packaging issue, add MANIFEST.in
- bump to 0.1.1

## vcspull 0.0.1 (2013-10-08)

- move to semver

## vcspull 0.0.1 (2013-10-06)

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

[tmuxp]: http://tmuxp.git-pull.com
[pep257]: http://www.python.org/dev/peps/pep-0257/
[pep8]: http://www.python.org/dev/peps/pep-0008/
[sphinx-argparse]: https://github.com/tony/sphinx-argparse
[argcomplete]: https://github.com/kislyuk/argcomplete
[tony/cookiecutter-pypackage]: https://github.com/tony/cookiecutter-pypackage.
[#14]: https://github.com/vcs-python/vcspull/issues/14
[click]: https://github.com/pallets/click
[fnmatch]: http://pubs.opengroup.org/onlinepubs/009695399/functions/fnmatch.html

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