Changelogs >


PyUp actively tracks 419,855 Python packages for vulnerabilities to keep your Python environments secure.

Scan your dependencies


* Show which git commands are run by default.
* `tsrc init`: fix order of operations - clone the local manifest *before*
writing the workspace configuration. Fixes 344, where users could not run `init` a second
time if the previous call failed. Bug report by cgestes.
* `tsrc init`: do not assume the default branch of the manifest is `master`. Note that `master` is still hard-coded in a few places. See 347 for details.
* When using `-j 1`, do not sort repositories by lexical order of destination, but preserve
the order in which they were specified in the manifest. Suggested by raabf.


* Allow to use `python -m tsrc` in addition to just `tsrc`
* Documentation updates
* Bump mypy



* Bump minimum supported version to Python **3.7**.
* Introduce `ignore_submodules` repository option - Patch by Thomas Hiscock.
* When `-j` is not used, try getting the default `jobs` value from the
`TSRC_PARALLEL_JOBS` environment variable. Patch by Marcin Jaworski.


* Bump mkdocs from 1.2.2 to 1.2.3
* Bump pygit2
* Bump linters (flake8, mypy, black)
* Remove dependency on `attr`


* Ad more guides in the documentation
* Display absolute paths when performing file system operations
* `tsrc sync` now uses parallel jobs by default. Use `-j1` to force
sequential processing. Patch by gdubicki



* All of `tsrc` commands can now be run in parallel. Try for instance `tsrc sync -j auto`.

* `tsrc foreach` now sets a bunch of environment variables. This allows
developers to add new behaviors to tsrc without having to change its source code. See
the [relevant guide]( for more information.

* Augment documentation with more use cases and examples (still a work in progress)

Breaking changes

* Remove `tsrc version` - Use `tsrc --version` instead.

* The 'parallel' feature caused the output of some commands like
`foreach` or `log` to change slightly. Hopefully
`tsrc` output is now more consistent.

Bug fixes

* Fix crash when running `tsrc` without any arguments

* Fix crash when trying to clone repositories in some rare corner cases
(like the destination existing but not being a directory)

Internal changes

* Make all `tsrc` imports consistent
* Fix error when calling `repr` on `tsrc` Errors.


Bug fixes and small improvements

* Fix 268: `tsrc apply-manifest` now performs file system operation
* Always display workspace path at the beginning of any action
* Skip "performing file system operations" message if there is no
work to be done

Internal changes

* Bump linters and formatters (`black`, `mypy`, `isort` ...)
* Use `copier` to simplify maintenance of tools configuration


Repo selection

* Added -r (regex) and -i (inverse regex) params for filtering repos. Patch by xzr

Add support for submodules

* `tsrc` calls `git clone` with `--recurse-submodules` when adding missing repositories
* `tsrc` calls `git submodule update --init --recursive` when updating repositories


* Remove codecov usage
* Rename default branch to `main`.


* Project has been moved from `TankerHQ` organization to `dmerejkowsky`. New urls are:

* []( for the git repository
* []( for the documentation

* Add CI jobs to check this project also works with Python 3.9
* Drop ``Path Pie`` dependency
* Minor internal fixes
* Add more URLs in the metadata (and project page)


Add symlink support

`tsrc sync` and `tsrc init` can now create symlinks as specified in the manifest file:


- url: gitgitlab.local:proj1/app
dest: app
- source: app/some_file
target: ../some_file

In this case, a symlink will be created from `<workspace>/app/some_file` to `<workspace>/some_file`.
(both `source` and `target` keys are relative to the repository's destination).

Changes related to groups

* log, status, and sync all learned about the `--group` option and the `--all-cloned` options
* foreach: remove the `--groups-from-config` options since this is now the default behavior


* Rework FAQ
* Run black in ``
* Fix formatting of some messages
* Update code manifesto to suggest using docstrings in tests


url: "https://acme.corp/foo"
dest : foo
file: some-file
dest: some-file

This should make it clearer what `tsrc` does because:

* `dest` now always refers to a relative path in the workspace (both in `repo`
and `copy`).
* By using `repo.copy.file` it's obvious that `tsrc` only supports copying
files, not directories.

Supported Python versions

Drop support for Python 3.5

New features

* `tsrc init` learned a `-r, --remote` option that pins the remote with the
given name as the only remote to be used for cloning and syncing.
`tsrc` expects this remote to be present in the manifest for all repositories.
This is useful if you use the same workspace in different physical locations,
and one of the remotes is behind a VPN for instance. Patch by tronje.

Bug fixes

* Fix [217]( Preserves file attributes during the `copy` statements in `repos`


* The whole test suite now runs without errors on Windows - and Windows support is
now part of the GitHub actions checks.
* The tests now run faster and with more readable output (this was done by using `libgit2`
instead of running git commands in the tests helpers).
* Add a scheduled GitHub action to run `safety`
* Remove usage of deprecated API of the `path` library.
* Run tests and linters for external pull requests too.


* Remove the `tsrc push` command and all review automation features. Please
use [hub](, [lab](,
or [repo]( instead.
See [207]( for the discussion leading
to this removal.

* Implement small improvements on `tsrc` output messages.
* Add `tsrc apply-manifest`, to apply changes in a manifest file locally, without
having to make a commit and push to a server first.


* Use [poetry]( for dependency management and packaging.


* Fix `python_requires` value in project metadata


* Fix 196: Do not attempt file copies for non-cloned repositories when using `tsrc init` with a list of groups.


Starting the new year with a stable release, at last!

Revamp group UX

The changes below in the configuration file and command line syntax allow for better UX regarding groups. See the
[corresponding milestone]( for the full list.

New configuration file

Previously, `tsrc` stored its permanent configuration in `.tsrc/manifest.yml` and the file was not supposed to be edited by hand. Instead, users could use `tsrc init` to modify it, for instance with the `--branch` argument.

Starting with this release, the command `tsrc init` can only be run once per workspace, and you must edit the `.tsrc/config.yml` file instead.

Changes in command line syntax

* `tsrc init`: remove `--file` option.
* `tsrc foreach`: instead of repeating the `--group` option, you can use `--groups` with a list of groups:

tsrc init --group foo --group bar

tsrc init --groups foo bar

* `tsrc init` learned a `--clone-all-repos` option to clone all repositories from the manifest,
regardless of the groups. Fix 181

* Remove `--file` option from `tsrc init`.

* `tsrc foreach` learned a `--groups-from-config` option to use the groups configured in the workspace. Fix 178, 179.

* `tsrc push` learned a `-o, --origin` option to specify a remote name different from "origin". Fix 170

Other fixes

* Try and check that GitLab installation support required features before using them -
typically, using `tsrc push --approvers` on GitLab Community Edition. (165)
- reported by irizzant.
* Switch to GitHub actions for running tests and linters. Also, publish documentation automatically
when something is pushed to the `master` branch.
* `tsrc status` : add information when local branch does not match manifest
configuration. (190). Feature suggested by janjachnick


* Additional bug fix for 165 - the fix in 0.9.1 was incomplete
* Improve error message when trying to use non-supported GitLab features (like using `tsrc push --reviewer`
on GitLab Community Edition)


* Improve error message when `tsrc foreach` fails to start the process. Suggested by dlewis-ald in 163
* Fix crash when finding reviewers for a GitLab project not in a group. Reported by irizzant in 165


* Add support for GitHub Enterprise: patch by sdavids13.
* Improve error message when using creating a merge request in a GitLab repository when the token cannot be found in the `tsrc` configuration file. Fix 158
* Fix crash when running `tsrc status` on a workspace with missing repositories (160) - reported by blastrock


* Implement `tsrc sync --force`. Currently all it does is running `git fetch --force` on all repositories. Use with caution. See 152 for details.


* Fix crash in `tsrc sync` when the `repo` configuration in the manifest contained neither an URL nor a remote. `tsrc` now aborts as soon as the misconfiguration of the manifest is detected (Reported by jongep86)


* Add a `--file` option to `tsrc init` so that manifest can be read from
a custom path in the file system
* Remove support for Python 3.4
* Switch from `xdg` to `pyxdg`
* Format the code with [black](


* Remove raw HTML from README.rst


* Use `` to measure coverage
* Prettify README


* Remove support for Python 3.3.
* Use new and shiny [cli-ui]( package instead of old `python-cli-ui`.


* GitHub organization is now `TankerHQ`
* We now use [dmenv]( for dependencies management


Fix crash when using `tsrc push` on a GitHub repository for the first time.


Fix weird output when configuring remotes.


Add support for multiple remotes

still valid (implicit 'origin' remote)
src: foo

also valid (two explicit remotes)
src: foo
- { name: origin, url: }
- { name: upstream, url:}

not valid (ambiguous)
src: foo
- { name: upstream, url: }

Thanks tst2005 and cgestes for their help with the configuration format.

tsrc foreach

* `tsrc foreach`: add a `--group` option to select the repositories to run the command on. Fix 40

Other fixes

* Fix [113]( do not hide branch when showing tag status.
* Add support for Python 3.7


* Add support for setting approvers with the `-r,--approvers` option in `tsrc push` (GitLab Enterprise Edition only).


* Fixed regression: `tsrc push` was no longer able to create a merge request on GitLab if `--target` was not set.



* Preliminary GitHub support
* `tsrc push`: new features and bug fixes
* Improved fixed reference handling
* Support for shallow clones

See below for the details.

Preliminary GitHub support

* Added support for creating merge requests on GitHub. No configuration required. Just make sure you are using `tsrc` from a repository which has a URL starting with ``.

`tsrc` will prompt you once for your login and password and then store an API token.

Afterwards, you'll be able to use `tsrc` push to:

* Create a pull request (or update it if it already exists)
* Assign people to the request (with the `-a/--assignee` option)
* Request reviewers (with the `--reviewers` option)
* Merge the pull request (with the `--merge` option)

This change has no impact if you were already using `GitLab`.

`tsrc push`: new features and bug fixes

* Add ``--close`` option.
* **Breaking change**: `-m/--message` option is gone, use `--title` instead. There's a concept of "description" or "message" for pull requests and merge requests, but the value of the option was only used to update the *title*, so it had to be renamed.
* Do not assume local and remote tracking branch have the same name.
* Allow using `tsrc push <local>:<remote>` to explicitly specify local and remote branch names.
* Fix bugs when target is not specified on the command line. See [this commit]( for details.
* Fix missing merge requests in `tsrc push` (see [issue 80]( Patch by maximerety.

Improve fixed reference handling

**Breaking change**: Instead of using `fixed_ref` in the manifest, you should now use `tag` or `sha1`:

- src:
fixed_ref: 42a70


- src:
tag: v0.1

See the [dedicated section about manifest format](ref/workspace-config.mdrepos) and the [57 pull request discussion]( for the details.

This allow us to implement different behaviors depending on whether or not the fixed ref is a tag or just a sha1.

Support for shallow clones

To save time and space, you can use `tsrc init --shallow` to only have shallow clones in your workspace.

Note that due to limitations in `git` itself, the `shallow` option cannot be used with a fixed SHA1. If you need this, prefer using a `tag` instead.


* Organization `TankerApp` was renamed to `TankerHQ`. New urls are:

* []( for the git repository
* []( for the documentation

* We now use [pipenv]( for dependency handling.


* Improve `tsrc status` to handle tags. Patch by arnaudgelas.
* Fix crash when running `tsrc version`.


* Improve `tsrc status` output. Now also shows number of commits ahead and behind, and display a short SHA-1 when not on any branch. Initial patch by arnaudgelas.


*Breaking change*: Add support for groups (30). Reported by arnaudgelas.

See the [dedicated section about manifest format](ref/manifest-config.mdgroups) for details.


* `tsrc push --assignee`: fix when there are more than 50 GitLab users (25). Reported by arnaudgelas


* Split user interface functionality into its own project: [python-cli-ui](

* Add `--quiet` and `--color` global options.


Bug fix release.

* `tsrc init`: Fix crash when a repository is empty (17). Reported by nicolasbrechet
* `tsrc push`: Fix rude message when credentials are missing (20). Reported by cgestes


Packaging fixes.


* Support for specifying custom branches in the manifest
* Support for specifying fixed refs (tags or hashes) in the manifest

New syntax is:

- src: foo
branch: next

- src: bar
branch: master
fixed_ref: v0.1

Note that `branch` is still required.

* You can now skip the `dest` part of the `copy` section if `src` and `dest` are

- src:foo

same thing as
- src: foo
dest: foo


Support for Python 3.3, 3.4, 3.5 and 3.6


First public release