2019-02-04 07:20:59 +01:00
|
|
|
---
|
|
|
|
title: How to develop on borgmatic
|
2020-08-21 23:27:47 +02:00
|
|
|
eleventyNavigation:
|
2022-05-20 20:11:35 +02:00
|
|
|
key: 🏗️ Develop on borgmatic
|
2020-08-21 23:27:47 +02:00
|
|
|
parent: How-to guides
|
2022-06-17 00:30:53 +02:00
|
|
|
order: 13
|
2019-02-04 07:20:59 +01:00
|
|
|
---
|
|
|
|
## Source code
|
|
|
|
|
2023-07-12 07:10:57 +02:00
|
|
|
To get set up to develop on borgmatic, first clone it via HTTPS or SSH:
|
2019-02-04 07:20:59 +01:00
|
|
|
|
|
|
|
```bash
|
2021-09-14 20:32:01 +02:00
|
|
|
git clone https://projects.torsion.org/borgmatic-collective/borgmatic.git
|
2019-02-04 07:20:59 +01:00
|
|
|
```
|
|
|
|
|
|
|
|
Or:
|
|
|
|
|
|
|
|
```bash
|
2021-09-14 20:32:01 +02:00
|
|
|
git clone ssh://git@projects.torsion.org:3022/borgmatic-collective/borgmatic.git
|
2019-02-04 07:20:59 +01:00
|
|
|
```
|
|
|
|
|
|
|
|
Then, install borgmatic
|
2021-10-22 23:06:27 +02:00
|
|
|
"[editable](https://pip.pypa.io/en/stable/cli/pip_install/#editable-installs)"
|
2023-07-12 07:10:57 +02:00
|
|
|
so that you can run borgmatic actions during development to make sure your
|
|
|
|
changes work.
|
2019-02-04 07:20:59 +01:00
|
|
|
|
|
|
|
```bash
|
2023-03-28 21:45:39 +02:00
|
|
|
cd borgmatic
|
2023-03-15 11:50:47 +01:00
|
|
|
pip3 install --user --editable .
|
2019-02-04 07:20:59 +01:00
|
|
|
```
|
|
|
|
|
|
|
|
Note that this will typically install the borgmatic commands into
|
|
|
|
`~/.local/bin`, which may or may not be on your PATH. There are other ways to
|
|
|
|
install borgmatic editable as well, for instance into the system Python
|
|
|
|
install (so without `--user`, as root), or even into a
|
|
|
|
[virtualenv](https://virtualenv.pypa.io/en/stable/). How or where you install
|
|
|
|
borgmatic is up to you, but generally an editable install makes development
|
|
|
|
and testing easier.
|
|
|
|
|
|
|
|
|
|
|
|
## Automated tests
|
|
|
|
|
|
|
|
Assuming you've cloned the borgmatic source code as described above, and
|
|
|
|
you're in the `borgmatic/` working copy, install tox, which is used for
|
|
|
|
setting up testing environments:
|
|
|
|
|
|
|
|
```bash
|
2019-05-13 13:18:45 +02:00
|
|
|
pip3 install --user tox
|
2019-02-04 07:20:59 +01:00
|
|
|
```
|
|
|
|
|
|
|
|
Finally, to actually run tests, run:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
tox
|
|
|
|
```
|
|
|
|
|
|
|
|
### Code formatting
|
|
|
|
|
|
|
|
If when running tests, you get an error from the
|
|
|
|
[Black](https://black.readthedocs.io/en/stable/) code formatter about files
|
|
|
|
that would be reformatted, you can ask Black to format them for you via the
|
|
|
|
following:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
tox -e black
|
|
|
|
```
|
|
|
|
|
2019-05-16 21:06:55 +02:00
|
|
|
And if you get a complaint from the
|
|
|
|
[isort](https://github.com/timothycrosley/isort) Python import orderer, you
|
|
|
|
can ask isort to order your imports for you:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
tox -e isort
|
|
|
|
```
|
|
|
|
|
2023-04-01 20:03:59 +02:00
|
|
|
Similarly, if you get errors about spelling mistakes in source code, you can
|
2023-04-01 23:38:52 +02:00
|
|
|
ask [codespell](https://github.com/codespell-project/codespell) to correct
|
|
|
|
them:
|
2023-04-01 20:03:59 +02:00
|
|
|
|
|
|
|
```bash
|
|
|
|
tox -e codespell
|
|
|
|
```
|
|
|
|
|
|
|
|
|
2019-02-04 07:20:59 +01:00
|
|
|
### End-to-end tests
|
|
|
|
|
|
|
|
borgmatic additionally includes some end-to-end tests that integration test
|
2019-12-12 01:43:01 +01:00
|
|
|
with Borg and supported databases for a few representative scenarios. These
|
|
|
|
tests don't run by default when running `tox`, because they're relatively slow
|
2023-04-17 00:41:17 +02:00
|
|
|
and depend on containers for runtime dependencies. These tests do run on the
|
|
|
|
continuous integration (CI) server, and running them on your developer machine
|
|
|
|
is the closest thing to CI-test parity.
|
2019-12-12 01:43:01 +01:00
|
|
|
|
2023-04-17 00:41:17 +02:00
|
|
|
If you would like to run the full test suite, first install Docker (or Podman;
|
|
|
|
see below) and [Docker Compose](https://docs.docker.com/compose/install/).
|
|
|
|
Then run:
|
2019-02-04 07:20:59 +01:00
|
|
|
|
|
|
|
```bash
|
2023-03-25 00:24:00 +01:00
|
|
|
scripts/run-end-to-end-dev-tests
|
2019-02-04 07:20:59 +01:00
|
|
|
```
|
|
|
|
|
2023-04-17 00:41:17 +02:00
|
|
|
This script assumes you have permission to run `docker`. If you don't, then
|
|
|
|
you may need to run with `sudo`.
|
2019-12-12 01:43:01 +01:00
|
|
|
|
2023-04-10 23:26:54 +02:00
|
|
|
|
|
|
|
#### Podman
|
|
|
|
|
|
|
|
<span class="minilink minilink-addedin">New in version 1.7.12</span>
|
|
|
|
borgmatic's end-to-end tests optionally support using
|
|
|
|
[rootless](https://github.com/containers/podman/blob/main/docs/tutorials/rootless_tutorial.md)
|
|
|
|
[Podman](https://podman.io/) instead of Docker.
|
|
|
|
|
|
|
|
Setting up Podman is outside the scope of this documentation, but here are
|
|
|
|
some key points to double-check:
|
|
|
|
|
2023-04-22 19:07:40 +02:00
|
|
|
* Install Podman and your desired networking support.
|
2023-04-10 23:26:54 +02:00
|
|
|
* Configure `/etc/subuid` and `/etc/subgid` to map users/groups for the
|
|
|
|
non-root user who will run tests.
|
|
|
|
* Create a non-root Podman socket for that user:
|
|
|
|
```bash
|
|
|
|
systemctl --user enable --now podman.socket
|
2023-04-17 00:41:17 +02:00
|
|
|
systemctl --user start --now podman.socket
|
2023-04-10 23:26:54 +02:00
|
|
|
```
|
|
|
|
|
|
|
|
Then you'll be able to run end-to-end tests as per normal, and the test script
|
|
|
|
will automatically use your non-root Podman socket instead of a Docker socket.
|
|
|
|
|
|
|
|
|
2019-02-04 07:20:59 +01:00
|
|
|
## Code style
|
|
|
|
|
|
|
|
Start with [PEP 8](https://www.python.org/dev/peps/pep-0008/). But then, apply
|
|
|
|
the following deviations from it:
|
|
|
|
|
|
|
|
* For strings, prefer single quotes over double quotes.
|
|
|
|
* Limit all lines to a maximum of 100 characters.
|
|
|
|
* Use trailing commas within multiline values or argument lists.
|
2023-04-01 18:40:32 +02:00
|
|
|
* For multiline constructs, put opening and closing delimiters on lines
|
2019-02-04 07:20:59 +01:00
|
|
|
separate from their contents.
|
|
|
|
* Within multiline constructs, use standard four-space indentation. Don't align
|
2023-04-01 18:40:32 +02:00
|
|
|
indentation with an opening delimiter.
|
2019-02-04 07:20:59 +01:00
|
|
|
|
|
|
|
borgmatic code uses the [Black](https://black.readthedocs.io/en/stable/) code
|
2019-05-16 21:06:55 +02:00
|
|
|
formatter, the [Flake8](http://flake8.pycqa.org/en/latest/) code checker, and
|
|
|
|
the [isort](https://github.com/timothycrosley/isort) import orderer, so
|
2019-02-04 07:20:59 +01:00
|
|
|
certain code style requirements will be enforced when running automated tests.
|
2019-05-16 21:06:55 +02:00
|
|
|
See the Black, Flake8, and isort documentation for more information.
|
2019-02-04 07:20:59 +01:00
|
|
|
|
2019-05-13 22:56:59 +02:00
|
|
|
## Continuous integration
|
|
|
|
|
2019-05-13 23:54:24 +02:00
|
|
|
Each pull request triggers a continuous integration build which runs the test
|
|
|
|
suite. You can view these builds on
|
2021-09-14 20:35:34 +02:00
|
|
|
[build.torsion.org](https://build.torsion.org/borgmatic-collective/borgmatic), and they're
|
2019-05-13 23:54:24 +02:00
|
|
|
also linked from the commits list on each pull request.
|
2019-02-04 07:20:59 +01:00
|
|
|
|
2019-10-30 18:54:42 +01:00
|
|
|
## Documentation development
|
|
|
|
|
|
|
|
Updates to borgmatic's documentation are welcome. It's formatted in Markdown
|
|
|
|
and located in the `docs/` directory in borgmatic's source, plus the
|
|
|
|
`README.md` file at the root.
|
|
|
|
|
2019-10-30 18:55:40 +01:00
|
|
|
To build and view a copy of the documentation with your local changes, run the
|
|
|
|
following from the root of borgmatic's source code:
|
2019-10-30 18:54:42 +01:00
|
|
|
|
|
|
|
```bash
|
2023-04-17 00:41:17 +02:00
|
|
|
scripts/dev-docs
|
2019-10-30 18:54:42 +01:00
|
|
|
```
|
|
|
|
|
2023-04-17 00:41:17 +02:00
|
|
|
This requires Docker (or Podman; see below) to be installed on your system.
|
|
|
|
This script assumes you have permission to run `docker`. If you don't, then
|
|
|
|
you may need to run with `sudo`.
|
2019-10-30 18:54:42 +01:00
|
|
|
|
|
|
|
After you run the script, you can point your web browser at
|
|
|
|
http://localhost:8080 to view the documentation with your changes.
|
|
|
|
|
|
|
|
To close the documentation server, ctrl-C the script. Note that it does not
|
|
|
|
currently auto-reload, so you'll need to stop it and re-run it for any
|
|
|
|
additional documentation changes to take effect.
|
2023-04-10 23:26:54 +02:00
|
|
|
|
|
|
|
|
|
|
|
#### Podman
|
|
|
|
|
|
|
|
<span class="minilink minilink-addedin">New in version 1.7.12</span>
|
|
|
|
borgmatic's developer build for documentation optionally supports using
|
|
|
|
[rootless](https://github.com/containers/podman/blob/main/docs/tutorials/rootless_tutorial.md)
|
|
|
|
[Podman](https://podman.io/) instead of Docker.
|
|
|
|
|
|
|
|
Setting up Podman is outside the scope of this documentation. But once you
|
2023-04-22 19:07:40 +02:00
|
|
|
install and configure Podman, then `scripts/dev-docs` should automatically use
|
2023-04-10 23:26:54 +02:00
|
|
|
Podman instead of Docker.
|