autogit is a command line tool for updating multiple GitLab or GitHub repositories with a single command.
Generate an access token at GitLab or GitHub and set it as environment variable:
export GITLAB_ACCESS_TOKEN=<token>
export GITHUB_OAUTH_TOKEN=<token>
export GIT_TOKEN=<token> # This one is used if previous ones are not foundProvide a list of repositories and a script or a command to run inside each of them:
autogit --repos repos.txt update_repo.pyWhere repos.txt could be:
https://gitlab.com/<handle>/<repo-title>
https://gitlab.com/<handle>/<repo-title2>.git
https://gitlab.com/<group>/<namespace>/<repo-title3>
https://github.com/<handle>/<repo-title4>
https://yourmanagedgit.com/<handle>/<repo-title5>
# https://yourmanagedgit.com/<handle>/<repo-title6> - this line is commented out
Try it yourself:
autogit \
--repo https://github.com/<handle>/<repo-title> \
--branch=add-hello-world-file \
--clone-to=tmp \
--commit-message="Add hello-world.txt file" \
touch hello-world.txtThese steps will be executed for each specified repository:
- The repository will be cloned into
/tmp/directory. - A new branch
add-hello-world-filewill be created or fetched if it already exists. - The command or a script will be executed inside the repository.
- A commit containing all the changes will be created.
- Newly created commit will be pushed to remote repository.
- A pull request will be created.
- [optional] A comment will be left next to the PR.
- [optional] The pull request will be merged.
These options could be used to specify more details:
| Option | Description | Type | Required |
|---|---|---|---|
--branch |
A name of a branch which will be used to commit changes to and to create Pull Request from (this branch will be created if it does not exist) | String | Yes |
--source-branch |
Base branch which will be used as a basis for a new branch creation. Target branch will be used by default. | String | No |
--target-branch |
Branch to be used as a target in a Pull Request. | String | No |
--commit-message |
A commit message which will be used for all of the changes made. | String | No |
--clone-to |
Path to temporal directory which will be used to clone repositories to | String | No |
--repo |
Link to repository | String | No |
--repos |
Filename which contains a list of repository links | String | No |
Options to be added in the future releases:
| Option | Description | Type | Required |
| --pr-title | Title of the Pull Request (commit message is used by default) | String | No |
| --pr-description | Pull Request description in Markdown format (empty by default) | String | No |
| --pr-reviewers | Comma separated list of usernames to assign as reviewers in newly created Pull Requests | String | No |
| --stop-on-failure | Exits immediately when an issue for at least one repo is detected (tries to create any possible PR by default, even if some repos failed to be processed) | Boolean | No |
| --max-api-concurrency | Max number of concurrent API requests (default 2) | Int | No |
More examples:
autogit --repos repos.txt ./examples/update_mypy_version.pyautogit is implemented in Python and uses coroutines to make multiple parallel API calls. Delays are being made after each API call in order not to get throttled.
-
Add unit tests for all the paths (mock gitpython, httpx requests)
- Implement state change dependencies on the tests.
- Implement RecorderMock for packages.
-
Package and release to PyPi
-
Run command as command line tool
- Stand-alone executable file download in Github releases.
-
Make API calls to GitLab
-
Support different API calls
-
Advanced features:
- Merge PRs which have all requirements like approvals met.
make venv - will create virtual env with dev dependencies.
make check - will run Flake8, MyPy and PyTest checks.
This tool was inspired by:
