mirror of
https://github.com/freedomofpress/dangerzone.git
synced 2025-05-06 21:41:49 +02:00
Compare commits
15 commits
1ed1dcee6b
...
396d53b130
Author | SHA1 | Date | |
---|---|---|---|
![]() |
396d53b130 | ||
![]() |
2f29095b31 | ||
![]() |
52eae7cd00 | ||
![]() |
ece58cba06 | ||
![]() |
eec4e6a5c3 | ||
![]() |
02261b112e | ||
![]() |
f400205c74 | ||
![]() |
5b1fe4d7ad | ||
![]() |
53214d33d8 | ||
![]() |
7f7fe43711 | ||
![]() |
f31fbfefc6 | ||
![]() |
96e64deae7 | ||
![]() |
60df4f7e35 | ||
![]() |
9fa3c80404 | ||
![]() |
4bf7f9cbb4 |
10 changed files with 584 additions and 332 deletions
|
@ -16,6 +16,10 @@ since 0.4.1, and this project adheres to [Semantic Versioning](https://semver.or
|
||||||
|
|
||||||
- Platform support: Drop support for Fedora 39, since it's end-of-life ([#999](https://github.com/freedomofpress/dangerzone/pull/999))
|
- Platform support: Drop support for Fedora 39, since it's end-of-life ([#999](https://github.com/freedomofpress/dangerzone/pull/999))
|
||||||
|
|
||||||
|
### Development changes
|
||||||
|
|
||||||
|
- Automate a large portion of our release tasks with `doit` ([#1016](https://github.com/freedomofpress/dangerzone/issues/1016))
|
||||||
|
|
||||||
## [0.8.0](https://github.com/freedomofpress/dangerzone/compare/v0.8.0...0.7.1)
|
## [0.8.0](https://github.com/freedomofpress/dangerzone/compare/v0.8.0...0.7.1)
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
199
QA.md
Normal file
199
QA.md
Normal file
|
@ -0,0 +1,199 @@
|
||||||
|
## QA
|
||||||
|
|
||||||
|
To ensure that new releases do not introduce regressions, and support existing
|
||||||
|
and newer platforms, we have to test that the produced packages work as expected.
|
||||||
|
|
||||||
|
Check the following:
|
||||||
|
|
||||||
|
- [ ] Make sure that the tip of the `main` branch passes the CI tests.
|
||||||
|
- [ ] Make sure that the Apple account has a valid application password and has
|
||||||
|
agreed to the latest Apple terms (see [macOS release](#macos-release)
|
||||||
|
section).
|
||||||
|
|
||||||
|
Because it is repetitive, we wrote a script to help with the QA.
|
||||||
|
It can run the tasks for you, pausing when it needs manual intervention.
|
||||||
|
|
||||||
|
You can run it with a command like:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
poetry run ./dev_scripts/qa.py {distro}-{version}
|
||||||
|
```
|
||||||
|
|
||||||
|
### The checklist
|
||||||
|
|
||||||
|
- [ ] Create a test build in Windows and make sure it works:
|
||||||
|
- [ ] Check if the suggested Python version is still supported.
|
||||||
|
- [ ] Create a new development environment with Poetry.
|
||||||
|
- [ ] Build the container image and ensure the development environment uses
|
||||||
|
the new image.
|
||||||
|
- [ ] Download the OCR language data using `./install/common/download-tessdata.py`
|
||||||
|
- [ ] Run the Dangerzone tests.
|
||||||
|
- [ ] Build and run the Dangerzone .exe
|
||||||
|
- [ ] Test some QA scenarios (see [Scenarios](#Scenarios) below).
|
||||||
|
- [ ] Create a test build in macOS (Intel CPU) and make sure it works:
|
||||||
|
- [ ] Check if the suggested Python version is still supported.
|
||||||
|
- [ ] Create a new development environment with Poetry.
|
||||||
|
- [ ] Build the container image and ensure the development environment uses
|
||||||
|
the new image.
|
||||||
|
- [ ] Download the OCR language data using `./install/common/download-tessdata.py`
|
||||||
|
- [ ] Run the Dangerzone tests.
|
||||||
|
- [ ] Create and run an app bundle.
|
||||||
|
- [ ] Test some QA scenarios (see [Scenarios](#Scenarios) below).
|
||||||
|
- [ ] Create a test build in macOS (M1/2 CPU) and make sure it works:
|
||||||
|
- [ ] Check if the suggested Python version is still supported.
|
||||||
|
- [ ] Create a new development environment with Poetry.
|
||||||
|
- [ ] Build the container image and ensure the development environment uses
|
||||||
|
the new image.
|
||||||
|
- [ ] Download the OCR language data using `./install/common/download-tessdata.py`
|
||||||
|
- [ ] Run the Dangerzone tests.
|
||||||
|
- [ ] Create and run an app bundle.
|
||||||
|
- [ ] Test some QA scenarios (see [Scenarios](#Scenarios) below).
|
||||||
|
- [ ] Create a test build in the most recent Ubuntu LTS platform (Ubuntu 24.04
|
||||||
|
as of writing this) and make sure it works:
|
||||||
|
- [ ] Create a new development environment with Poetry.
|
||||||
|
- [ ] Build the container image and ensure the development environment uses
|
||||||
|
the new image.
|
||||||
|
- [ ] Download the OCR language data using `./install/common/download-tessdata.py`
|
||||||
|
- [ ] Run the Dangerzone tests.
|
||||||
|
- [ ] Create a .deb package and install it system-wide.
|
||||||
|
- [ ] Test some QA scenarios (see [Scenarios](#Scenarios) below).
|
||||||
|
- [ ] Create a test build in the most recent Fedora platform (Fedora 41 as of
|
||||||
|
writing this) and make sure it works:
|
||||||
|
- [ ] Create a new development environment with Poetry.
|
||||||
|
- [ ] Build the container image and ensure the development environment uses
|
||||||
|
the new image.
|
||||||
|
- [ ] Download the OCR language data using `./install/common/download-tessdata.py`
|
||||||
|
- [ ] Run the Dangerzone tests.
|
||||||
|
- [ ] Create an .rpm package and install it system-wide.
|
||||||
|
- [ ] Test some QA scenarios (see [Scenarios](#Scenarios) below).
|
||||||
|
- [ ] Create a test build in the most recent Qubes Fedora template (Fedora 40 as
|
||||||
|
of writing this) and make sure it works:
|
||||||
|
- [ ] Create a new development environment with Poetry.
|
||||||
|
- [ ] Run the Dangerzone tests.
|
||||||
|
- [ ] Create a Qubes .rpm package and install it system-wide.
|
||||||
|
- [ ] Ensure that the Dangerzone application appears in the "Applications"
|
||||||
|
tab.
|
||||||
|
- [ ] Test some QA scenarios (see [Scenarios](#Scenarios) below) and make sure
|
||||||
|
they spawn disposable qubes.
|
||||||
|
|
||||||
|
### Scenarios
|
||||||
|
|
||||||
|
#### 1. Dangerzone correctly identifies that Docker/Podman is not installed
|
||||||
|
|
||||||
|
_(Only for MacOS / Windows)_
|
||||||
|
|
||||||
|
Temporarily hide the Docker/Podman binaries, e.g., rename the `docker` /
|
||||||
|
`podman` binaries to something else. Then run Dangerzone. Dangerzone should
|
||||||
|
prompt the user to install Docker/Podman.
|
||||||
|
|
||||||
|
#### 2. Dangerzone correctly identifies that Docker is not running
|
||||||
|
|
||||||
|
_(Only for MacOS / Windows)_
|
||||||
|
|
||||||
|
Stop the Docker Desktop application. Then run Dangerzone. Dangerzone should
|
||||||
|
prompt the user to start Docker Desktop.
|
||||||
|
|
||||||
|
|
||||||
|
#### 3. Updating Dangerzone handles external state correctly.
|
||||||
|
|
||||||
|
_(Applies to Windows/MacOS)_
|
||||||
|
|
||||||
|
Install the previous version of Dangerzone, downloaded from the website.
|
||||||
|
|
||||||
|
Open the Dangerzone application and enable some non-default settings.
|
||||||
|
**If there are new settings, make sure to change those as well**.
|
||||||
|
|
||||||
|
Close the Dangerzone application and get the container image for that
|
||||||
|
version. For example:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ docker images dangerzone.rocks/dangerzone
|
||||||
|
REPOSITORY TAG IMAGE ID CREATED SIZE
|
||||||
|
dangerzone.rocks/dangerzone latest <image ID> <date> <size>
|
||||||
|
dangerzone.rocks/dangerzone <tag> <image ID> <date> <size>
|
||||||
|
```
|
||||||
|
|
||||||
|
Then run the version under QA and ensure that the settings remain changed.
|
||||||
|
|
||||||
|
Afterwards check that new docker image was installed by running the same command
|
||||||
|
and seeing the following differences:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ docker images dangerzone.rocks/dangerzone
|
||||||
|
REPOSITORY TAG IMAGE ID CREATED SIZE
|
||||||
|
dangerzone.rocks/dangerzone latest <different ID> <newer date> <different size>
|
||||||
|
dangerzone.rocks/dangerzone <other tag> <different ID> <newer date> <different size>
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 4. Dangerzone successfully installs the container image
|
||||||
|
|
||||||
|
_(Only for Linux)_
|
||||||
|
|
||||||
|
Remove the Dangerzone container image from Docker/Podman. Then run Dangerzone.
|
||||||
|
Dangerzone should install the container image successfully.
|
||||||
|
|
||||||
|
#### 5. Dangerzone retains the settings of previous runs
|
||||||
|
|
||||||
|
Run Dangerzone and make some changes in the settings (e.g., change the OCR
|
||||||
|
language, toggle whether to open the document after conversion, etc.). Restart
|
||||||
|
Dangerzone. Dangerzone should show the settings that the user chose.
|
||||||
|
|
||||||
|
#### 6. Dangerzone reports failed conversions
|
||||||
|
|
||||||
|
Run Dangerzone and convert the `tests/test_docs/sample_bad_pdf.pdf` document.
|
||||||
|
Dangerzone should fail gracefully, by reporting that the operation failed, and
|
||||||
|
showing the following error message:
|
||||||
|
|
||||||
|
> The document format is not supported
|
||||||
|
|
||||||
|
#### 7. Dangerzone succeeds in converting multiple documents
|
||||||
|
|
||||||
|
Run Dangerzone against a list of documents, and tick all options. Ensure that:
|
||||||
|
* Conversions take place sequentially.
|
||||||
|
* Attempting to close the window while converting asks the user if they want to
|
||||||
|
abort the conversions.
|
||||||
|
* Conversions are completed successfully.
|
||||||
|
* Conversions show individual progress in real-time (double-check for Qubes).
|
||||||
|
* _(Only for Linux)_ The resulting files open with the PDF viewer of our choice.
|
||||||
|
* OCR seems to have detected characters in the PDF files.
|
||||||
|
* The resulting files have been saved with the proper suffix, in the proper
|
||||||
|
location.
|
||||||
|
* The original files have been saved in the `unsafe/` directory.
|
||||||
|
|
||||||
|
#### 8. Dangerzone is able to handle drag-n-drop
|
||||||
|
|
||||||
|
Run Dangerzone against a set of documents that you drag-n-drop. Files should be
|
||||||
|
added and conversion should run without issue.
|
||||||
|
|
||||||
|
> [!TIP]
|
||||||
|
> On our end-user container environments for Linux, we can start a file manager
|
||||||
|
> with `thunar &`.
|
||||||
|
|
||||||
|
#### 9. Dangerzone CLI succeeds in converting multiple documents
|
||||||
|
|
||||||
|
_(Only for Windows and Linux)_
|
||||||
|
|
||||||
|
Run Dangerzone CLI against a list of documents. Ensure that conversions happen
|
||||||
|
sequentially, are completed successfully, and we see their progress.
|
||||||
|
|
||||||
|
#### 10. Dangerzone can open a document for conversion via right-click -> "Open With"
|
||||||
|
|
||||||
|
_(Only for Windows, MacOS and Qubes)_
|
||||||
|
|
||||||
|
Go to a directory with office documents, right-click on one, and click on "Open
|
||||||
|
With". We should be able to open the file with Dangerzone, and then convert it.
|
||||||
|
|
||||||
|
#### 11. Dangerzone shows helpful errors for setup issues on Qubes
|
||||||
|
|
||||||
|
_(Only for Qubes)_
|
||||||
|
|
||||||
|
Check what errors does Dangerzone throw in the following scenarios. The errors
|
||||||
|
should point the user to the Qubes notifications in the top-right corner:
|
||||||
|
|
||||||
|
1. The `dz-dvm` template does not exist. We can trigger this scenario by
|
||||||
|
temporarily renaming this template.
|
||||||
|
2. The Dangerzone RPC policy does not exist. We can trigger this scenario by
|
||||||
|
temporarily renaming the `dz.Convert` policy.
|
||||||
|
3. The `dz-dvm` disposable Qube cannot start due to insufficient resources. We
|
||||||
|
can trigger this scenario by temporarily increasing the minimum required RAM
|
||||||
|
of the `dz-dvm` template to more than the available amount.
|
419
RELEASE.md
419
RELEASE.md
|
@ -1,12 +1,17 @@
|
||||||
# Release instructions
|
# Release instructions
|
||||||
|
|
||||||
This section documents the release process. Unless you're a dangerzone developer making a release, you'll probably never need to follow it.
|
This section documents how we currently release Dangerzone for the different distributions we support.
|
||||||
|
|
||||||
## Pre-release
|
## Pre-release
|
||||||
|
|
||||||
Before making a release, all of these should be complete:
|
Here is a list of tasks that should be done before issuing the release:
|
||||||
|
|
||||||
- [ ] Copy the checkboxes from these instructions onto a new issue and call it **QA and Release version \<VERSION\>**
|
- [ ] Create a new issue named **QA and Release for version \<VERSION\>**, to track the general progress.
|
||||||
|
You can generate its content with:
|
||||||
|
|
||||||
|
```
|
||||||
|
poetry run ./dev_scripts/generate-release-tasks.py`
|
||||||
|
```
|
||||||
- [ ] [Add new Linux platforms and remove obsolete ones](https://github.com/freedomofpress/dangerzone/blob/main/RELEASE.md#add-new-platforms-and-remove-obsolete-ones)
|
- [ ] [Add new Linux platforms and remove obsolete ones](https://github.com/freedomofpress/dangerzone/blob/main/RELEASE.md#add-new-platforms-and-remove-obsolete-ones)
|
||||||
- [ ] Bump the Python dependencies using `poetry lock`
|
- [ ] Bump the Python dependencies using `poetry lock`
|
||||||
- [ ] Update `version` in `pyproject.toml`
|
- [ ] Update `version` in `pyproject.toml`
|
||||||
|
@ -15,6 +20,8 @@ Before making a release, all of these should be complete:
|
||||||
- [ ] Bump the Debian version by adding a new changelog entry in `debian/changelog`
|
- [ ] Bump the Debian version by adding a new changelog entry in `debian/changelog`
|
||||||
- [ ] Update screenshot in `README.md`, if necessary
|
- [ ] Update screenshot in `README.md`, if necessary
|
||||||
- [ ] CHANGELOG.md should be updated to include a list of all major changes since the last release
|
- [ ] CHANGELOG.md should be updated to include a list of all major changes since the last release
|
||||||
|
- [ ] A draft release should be created. Copy the release notes text from the template at [`docs/templates/release-notes`](https://github.com/freedomofpress/dangerzone/tree/main/docs/templates/)
|
||||||
|
- [ ] Do the QA tasks
|
||||||
|
|
||||||
## Add new Linux platforms and remove obsolete ones
|
## Add new Linux platforms and remove obsolete ones
|
||||||
|
|
||||||
|
@ -37,7 +44,7 @@ In case of a new version (beta, RC, or official release):
|
||||||
`BUILD.md` files where necessary.
|
`BUILD.md` files where necessary.
|
||||||
4. Send a PR with the above changes.
|
4. Send a PR with the above changes.
|
||||||
|
|
||||||
In case of an EOL version:
|
In case of the removal of a version:
|
||||||
|
|
||||||
1. Remove any mention to this version from our repo.
|
1. Remove any mention to this version from our repo.
|
||||||
* Consult the previous paragraph, but also `grep` your way around.
|
* Consult the previous paragraph, but also `grep` your way around.
|
||||||
|
@ -51,194 +58,13 @@ Follow the instructions in `docs/developer/TESTING.md` to run the tests.
|
||||||
|
|
||||||
These tests will identify any regressions or progression in terms of document coverage.
|
These tests will identify any regressions or progression in terms of document coverage.
|
||||||
|
|
||||||
## QA
|
|
||||||
|
|
||||||
To ensure that new releases do not introduce regressions, and support existing
|
|
||||||
and newer platforms, we have to do the following:
|
|
||||||
|
|
||||||
- [ ] Make sure that the tip of the `main` branch passes the CI tests.
|
|
||||||
- [ ] Make sure that the Apple account has a valid application password and has
|
|
||||||
agreed to the latest Apple terms (see [macOS release](#macos-release)
|
|
||||||
section).
|
|
||||||
- [ ] Create a test build in Windows and make sure it works:
|
|
||||||
- [ ] Check if the suggested Python version is still supported.
|
|
||||||
- [ ] Create a new development environment with Poetry.
|
|
||||||
- [ ] Build the container image and ensure the development environment uses
|
|
||||||
the new image.
|
|
||||||
- [ ] Run the Dangerzone tests.
|
|
||||||
- [ ] Build and run the Dangerzone .exe
|
|
||||||
- [ ] Test some QA scenarios (see [Scenarios](#Scenarios) below).
|
|
||||||
- [ ] Create a test build in macOS (Intel CPU) and make sure it works:
|
|
||||||
- [ ] Check if the suggested Python version is still supported.
|
|
||||||
- [ ] Create a new development environment with Poetry.
|
|
||||||
- [ ] Build the container image and ensure the development environment uses
|
|
||||||
the new image.
|
|
||||||
- [ ] Run the Dangerzone tests.
|
|
||||||
- [ ] Create and run an app bundle.
|
|
||||||
- [ ] Test some QA scenarios (see [Scenarios](#Scenarios) below).
|
|
||||||
- [ ] Create a test build in macOS (M1/2 CPU) and make sure it works:
|
|
||||||
- [ ] Check if the suggested Python version is still supported.
|
|
||||||
- [ ] Create a new development environment with Poetry.
|
|
||||||
- [ ] Build the container image and ensure the development environment uses
|
|
||||||
the new image.
|
|
||||||
- [ ] Run the Dangerzone tests.
|
|
||||||
- [ ] Create and run an app bundle.
|
|
||||||
- [ ] Test some QA scenarios (see [Scenarios](#Scenarios) below).
|
|
||||||
- [ ] Create a test build in the most recent Ubuntu LTS platform (Ubuntu 24.04
|
|
||||||
as of writing this) and make sure it works:
|
|
||||||
- [ ] Create a new development environment with Poetry.
|
|
||||||
- [ ] Build the container image and ensure the development environment uses
|
|
||||||
the new image.
|
|
||||||
- [ ] Run the Dangerzone tests.
|
|
||||||
- [ ] Create a .deb package and install it system-wide.
|
|
||||||
- [ ] Test some QA scenarios (see [Scenarios](#Scenarios) below).
|
|
||||||
- [ ] Create a test build in the most recent Fedora platform (Fedora 41 as of
|
|
||||||
writing this) and make sure it works:
|
|
||||||
- [ ] Create a new development environment with Poetry.
|
|
||||||
- [ ] Build the container image and ensure the development environment uses
|
|
||||||
the new image.
|
|
||||||
- [ ] Run the Dangerzone tests.
|
|
||||||
- [ ] Create an .rpm package and install it system-wide.
|
|
||||||
- [ ] Test some QA scenarios (see [Scenarios](#Scenarios) below).
|
|
||||||
- [ ] Create a test build in the most recent Qubes Fedora template (Fedora 40 as
|
|
||||||
of writing this) and make sure it works:
|
|
||||||
- [ ] Create a new development environment with Poetry.
|
|
||||||
- [ ] Run the Dangerzone tests.
|
|
||||||
- [ ] Create a Qubes .rpm package and install it system-wide.
|
|
||||||
- [ ] Ensure that the Dangerzone application appears in the "Applications"
|
|
||||||
tab.
|
|
||||||
- [ ] Test some QA scenarios (see [Scenarios](#Scenarios) below) and make sure
|
|
||||||
they spawn disposable qubes.
|
|
||||||
|
|
||||||
### Scenarios
|
|
||||||
|
|
||||||
#### 1. Dangerzone correctly identifies that Docker/Podman is not installed
|
|
||||||
|
|
||||||
_(Only for MacOS / Windows)_
|
|
||||||
|
|
||||||
Temporarily hide the Docker/Podman binaries, e.g., rename the `docker` /
|
|
||||||
`podman` binaries to something else. Then run Dangerzone. Dangerzone should
|
|
||||||
prompt the user to install Docker/Podman.
|
|
||||||
|
|
||||||
#### 2. Dangerzone correctly identifies that Docker is not running
|
|
||||||
|
|
||||||
_(Only for MacOS / Windows)_
|
|
||||||
|
|
||||||
Stop the Docker Desktop application. Then run Dangerzone. Dangerzone should
|
|
||||||
prompt the user to start Docker Desktop.
|
|
||||||
|
|
||||||
|
|
||||||
#### 3. Updating Dangerzone handles external state correctly.
|
|
||||||
|
|
||||||
_(Applies to Windows/MacOS)_
|
|
||||||
|
|
||||||
Install the previous version of Dangerzone, downloaded from the website.
|
|
||||||
|
|
||||||
Open the Dangerzone application and enable some non-default settings.
|
|
||||||
**If there are new settings, make sure to change those as well**.
|
|
||||||
|
|
||||||
Close the Dangerzone application and get the container image for that
|
|
||||||
version. For example:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ docker images dangerzone.rocks/dangerzone
|
|
||||||
REPOSITORY TAG IMAGE ID CREATED SIZE
|
|
||||||
dangerzone.rocks/dangerzone latest <image ID> <date> <size>
|
|
||||||
dangerzone.rocks/dangerzone <tag> <image ID> <date> <size>
|
|
||||||
```
|
|
||||||
|
|
||||||
Then run the version under QA and ensure that the settings remain changed.
|
|
||||||
|
|
||||||
Afterwards check that new docker image was installed by running the same command
|
|
||||||
and seeing the following differences:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ docker images dangerzone.rocks/dangerzone
|
|
||||||
REPOSITORY TAG IMAGE ID CREATED SIZE
|
|
||||||
dangerzone.rocks/dangerzone latest <different ID> <newer date> <different size>
|
|
||||||
dangerzone.rocks/dangerzone <other tag> <different ID> <newer date> <different size>
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 4. Dangerzone successfully installs the container image
|
|
||||||
|
|
||||||
_(Only for Linux)_
|
|
||||||
|
|
||||||
Remove the Dangerzone container image from Docker/Podman. Then run Dangerzone.
|
|
||||||
Dangerzone should install the container image successfully.
|
|
||||||
|
|
||||||
#### 5. Dangerzone retains the settings of previous runs
|
|
||||||
|
|
||||||
Run Dangerzone and make some changes in the settings (e.g., change the OCR
|
|
||||||
language, toggle whether to open the document after conversion, etc.). Restart
|
|
||||||
Dangerzone. Dangerzone should show the settings that the user chose.
|
|
||||||
|
|
||||||
#### 6. Dangerzone reports failed conversions
|
|
||||||
|
|
||||||
Run Dangerzone and convert the `tests/test_docs/sample_bad_pdf.pdf` document.
|
|
||||||
Dangerzone should fail gracefully, by reporting that the operation failed, and
|
|
||||||
showing the following error message:
|
|
||||||
|
|
||||||
> The document format is not supported
|
|
||||||
|
|
||||||
#### 7. Dangerzone succeeds in converting multiple documents
|
|
||||||
|
|
||||||
Run Dangerzone against a list of documents, and tick all options. Ensure that:
|
|
||||||
* Conversions take place sequentially.
|
|
||||||
* Attempting to close the window while converting asks the user if they want to
|
|
||||||
abort the conversions.
|
|
||||||
* Conversions are completed successfully.
|
|
||||||
* Conversions show individual progress in real-time (double-check for Qubes).
|
|
||||||
* _(Only for Linux)_ The resulting files open with the PDF viewer of our choice.
|
|
||||||
* OCR seems to have detected characters in the PDF files.
|
|
||||||
* The resulting files have been saved with the proper suffix, in the proper
|
|
||||||
location.
|
|
||||||
* The original files have been saved in the `unsafe/` directory.
|
|
||||||
|
|
||||||
#### 8. Dangerzone is able to handle drag-n-drop
|
|
||||||
|
|
||||||
Run Dangerzone against a set of documents that you drag-n-drop. Files should be
|
|
||||||
added and conversion should run without issue.
|
|
||||||
|
|
||||||
> [!TIP]
|
|
||||||
> On our end-user container environments for Linux, we can start a file manager
|
|
||||||
> with `thunar &`.
|
|
||||||
|
|
||||||
#### 9. Dangerzone CLI succeeds in converting multiple documents
|
|
||||||
|
|
||||||
_(Only for Windows and Linux)_
|
|
||||||
|
|
||||||
Run Dangerzone CLI against a list of documents. Ensure that conversions happen
|
|
||||||
sequentially, are completed successfully, and we see their progress.
|
|
||||||
|
|
||||||
#### 10. Dangerzone can open a document for conversion via right-click -> "Open With"
|
|
||||||
|
|
||||||
_(Only for Windows, MacOS and Qubes)_
|
|
||||||
|
|
||||||
Go to a directory with office documents, right-click on one, and click on "Open
|
|
||||||
With". We should be able to open the file with Dangerzone, and then convert it.
|
|
||||||
|
|
||||||
#### 11. Dangerzone shows helpful errors for setup issues on Qubes
|
|
||||||
|
|
||||||
_(Only for Qubes)_
|
|
||||||
|
|
||||||
Check what errors does Dangerzone throw in the following scenarios. The errors
|
|
||||||
should point the user to the Qubes notifications in the top-right corner:
|
|
||||||
|
|
||||||
1. The `dz-dvm` template does not exist. We can trigger this scenario by
|
|
||||||
temporarily renaming this template.
|
|
||||||
2. The Dangerzone RPC policy does not exist. We can trigger this scenario by
|
|
||||||
temporarily renaming the `dz.Convert` policy.
|
|
||||||
3. The `dz-dvm` disposable Qube cannot start due to insufficient resources. We
|
|
||||||
can trigger this scenario by temporarily increasing the minimum required RAM
|
|
||||||
of the `dz-dvm` template to more than the available amount.
|
|
||||||
|
|
||||||
## Release
|
## Release
|
||||||
|
|
||||||
Once we are confident that the release will be out shortly, and doesn't need any more changes:
|
Once we are confident that the release will be out shortly, and doesn't need any more changes:
|
||||||
|
|
||||||
- [ ] Create a PGP-signed git tag for the version, e.g., for dangerzone `v0.1.0`:
|
- [ ] Create a PGP-signed git tag for the version, e.g., for dangerzone `v0.1.0`:
|
||||||
|
|
||||||
```
|
```bash
|
||||||
git tag -s v0.1.0
|
git tag -s v0.1.0
|
||||||
git push origin v0.1.0
|
git push origin v0.1.0
|
||||||
```
|
```
|
||||||
|
@ -254,6 +80,17 @@ Once we are confident that the release will be out shortly, and doesn't need any
|
||||||
|
|
||||||
### macOS Release
|
### macOS Release
|
||||||
|
|
||||||
|
> [!TIP]
|
||||||
|
> You can automate these steps from your macOS terminal app with:
|
||||||
|
>
|
||||||
|
> ```
|
||||||
|
> doit clean
|
||||||
|
> doit -n 8 apple_id=<email> # for Intel macOS
|
||||||
|
> doit -n 8 apple_id=<email> macos_build_dmg # for Apple Silicon macOS
|
||||||
|
> ```
|
||||||
|
|
||||||
|
The following needs to happen for both Silicon and Intel chipsets.
|
||||||
|
|
||||||
#### Initial Setup
|
#### Initial Setup
|
||||||
|
|
||||||
- Build machine must have:
|
- Build machine must have:
|
||||||
|
@ -268,48 +105,83 @@ Once we are confident that the release will be out shortly, and doesn't need any
|
||||||
|
|
||||||
#### Releasing and Signing
|
#### Releasing and Signing
|
||||||
|
|
||||||
|
Here is what you need to do:
|
||||||
|
|
||||||
- [ ] Verify and install the latest supported Python version from
|
- [ ] Verify and install the latest supported Python version from
|
||||||
[python.org](https://www.python.org/downloads/macos/) (do not use the one from
|
[python.org](https://www.python.org/downloads/macos/) (do not use the one from
|
||||||
brew as it is known to [cause issues](https://github.com/freedomofpress/dangerzone/issues/471))
|
brew as it is known to [cause issues](https://github.com/freedomofpress/dangerzone/issues/471))
|
||||||
* In case of a new Python installation or minor version upgrade, e.g., from
|
|
||||||
3.11 to 3.12 , reinstall Poetry with `python3 -m pip install poetry`
|
- [ ] Checkout the dependencies, and clean your local copy:
|
||||||
* You can verify the correct Python version is used with `poetry debug info`
|
|
||||||
- [ ] Verify and checkout the git tag for this release
|
```bash
|
||||||
- [ ] Run `poetry install --sync`
|
|
||||||
- [ ] On the silicon mac, build the container image:
|
# In case of a new Python installation or minor version upgrade, e.g., from
|
||||||
|
# 3.11 to 3.12, reinstall Poetry
|
||||||
|
python3 -m pip install poetry
|
||||||
|
|
||||||
|
# You can verify the correct Python version is used
|
||||||
|
poetry debug info
|
||||||
|
|
||||||
|
# Replace with the actual version
|
||||||
|
export DZ_VERSION=$(cat share/version.txt)
|
||||||
|
|
||||||
|
# Verify and checkout the git tag for this release:
|
||||||
|
git checkout -f v$VERSION
|
||||||
|
|
||||||
|
# Clean the git repository
|
||||||
|
git clean -df
|
||||||
|
|
||||||
|
# Clean up the environment
|
||||||
|
poetry env remove --all
|
||||||
|
|
||||||
|
# Install the dependencies
|
||||||
|
poetry install --sync
|
||||||
```
|
```
|
||||||
python3 ./install/common/build-image.py
|
|
||||||
|
- [ ] Build the container image and the OCR language data
|
||||||
|
|
||||||
|
```bash
|
||||||
|
poetry run ./install/common/build-image.py
|
||||||
|
poetry run ./install/common/download-tessdata.py
|
||||||
|
|
||||||
|
# Copy the container image to the assets folder
|
||||||
|
cp share/container.tar.gz ~dz/release-assets/$VERSION/dangerzone-$VERSION-arm64.tar.gz
|
||||||
|
cp share/image-id.txt ~dz/release-assets/$VERSION/.
|
||||||
```
|
```
|
||||||
Then copy the `share/container.tar.gz` to the assets folder on `dangerzone-$VERSION-arm64.tar.gz`, along with the `share/image-id.txt` file.
|
|
||||||
- [ ] Run `poetry run ./install/macos/build-app.py`; this will make `dist/Dangerzone.app`
|
|
||||||
- [ ] Make sure that the built application works with the containerd graph
|
|
||||||
driver (see [#933](https://github.com/freedomofpress/dangerzone/issues/933))
|
|
||||||
- [ ] Run `poetry run ./install/macos/build-app.py --only-codesign`; this will make `dist/Dangerzone.dmg`
|
|
||||||
* You need to run this command as the account that has access to the code signing certificate
|
|
||||||
* You must run this command from the MacOS UI, from a terminal application.
|
|
||||||
- [ ] Notarize it: `xcrun notarytool submit --wait --apple-id "<email>" --keychain-profile "dz-notarytool-release-key" dist/Dangerzone.dmg`
|
|
||||||
* You need to change the `<email>` in the above command with the email
|
|
||||||
associated with the Apple Developer ID.
|
|
||||||
* This command assumes that you have created, and stored in the Keychain, an
|
|
||||||
application password associated with your Apple Developer ID, which will be
|
|
||||||
used specifically for `notarytool`.
|
|
||||||
- [ ] Wait for it to get approved:
|
|
||||||
* If it gets rejected, you should be able to see why with the same command
|
|
||||||
(or use the `log` option for a more verbose JSON output)
|
|
||||||
* You will also receive an update in your email.
|
|
||||||
- [ ] After it's approved, staple the ticket: `xcrun stapler staple dist/Dangerzone.dmg`
|
|
||||||
|
|
||||||
This process ends up with the final file:
|
- [ ] Build the app bundle
|
||||||
|
|
||||||
```
|
```bash
|
||||||
dist/Dangerzone.dmg
|
poetry run ./install/macos/build-app.py
|
||||||
```
|
```
|
||||||
|
|
||||||
Rename `Dangerzone.dmg` to `Dangerzone-$VERSION.dmg`.
|
- [ ] Sign the application bundle, and notarize it
|
||||||
|
|
||||||
|
You need to run this command as the account that has access to the code signing certificate
|
||||||
|
|
||||||
|
This command assumes that you have created, and stored in the Keychain, an
|
||||||
|
application password associated with your Apple Developer ID, which will be
|
||||||
|
used specifically for `notarytool`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Sign the .App and make it a .dmg
|
||||||
|
poetry run ./install/macos/build-app.py --only-codesign
|
||||||
|
|
||||||
|
# Notarize it. You must run this command from the MacOS UI
|
||||||
|
# from a terminal application.
|
||||||
|
xcrun notarytool submit ./dist/Dangerzone.dmg --apple-id $APPLE_ID --keychain-profile "dz-notarytool-release-key" --wait && xcrun stapler staple dist/Dangerzone.dmg
|
||||||
|
|
||||||
|
# Copy the .dmg to the assets folder
|
||||||
|
ARCH=$(uname -m)
|
||||||
|
if [ "$ARCH" = "x86_64" ]; then
|
||||||
|
ARCH="i686"
|
||||||
|
fi
|
||||||
|
cp dist/Dangerzone.dmg ~dz/release-assets/$VERSION/Dangerzone-$VERSION-$ARCH.dmg
|
||||||
|
```
|
||||||
|
|
||||||
### Windows Release
|
### Windows Release
|
||||||
|
|
||||||
The Windows release is performed in a Windows 11 virtual machine as opposed to a physical one.
|
The Windows release is performed in a Windows 11 virtual machine (as opposed to a physical one).
|
||||||
|
|
||||||
#### Initial Setup
|
#### Initial Setup
|
||||||
|
|
||||||
|
@ -323,8 +195,31 @@ The Windows release is performed in a Windows 11 virtual machine as opposed to a
|
||||||
|
|
||||||
#### Releasing and Signing
|
#### Releasing and Signing
|
||||||
|
|
||||||
- [ ] Verify and checkout the git tag for this release
|
- [ ] Checkout the dependencies, and clean your local copy:
|
||||||
- [ ] Run `poetry install --sync`
|
```bash
|
||||||
|
# In case of a new Python installation or minor version upgrade, e.g., from
|
||||||
|
# 3.11 to 3.12, reinstall Poetry
|
||||||
|
python3 -m pip install poetry
|
||||||
|
|
||||||
|
# You can verify the correct Python version is used
|
||||||
|
poetry debug info
|
||||||
|
|
||||||
|
# Replace with the actual version
|
||||||
|
export DZ_VERSION=$(cat share/version.txt)
|
||||||
|
|
||||||
|
# Verify and checkout the git tag for this release:
|
||||||
|
git checkout -f v$VERSION
|
||||||
|
|
||||||
|
# Clean the git repository
|
||||||
|
git clean -df
|
||||||
|
|
||||||
|
# Clean up the environment
|
||||||
|
poetry env remove --all
|
||||||
|
|
||||||
|
# Install the dependencies
|
||||||
|
poetry install --sync
|
||||||
|
```
|
||||||
|
|
||||||
- [ ] Copy the container image into the VM
|
- [ ] Copy the container image into the VM
|
||||||
> [!IMPORTANT]
|
> [!IMPORTANT]
|
||||||
> Instead of running `python .\install\windows\build-image.py` in the VM, run the build image script on the host (making sure to build for `linux/amd64`). Copy `share/container.tar.gz` and `share/image-id.txt` from the host into the `share` folder in the VM.
|
> Instead of running `python .\install\windows\build-image.py` in the VM, run the build image script on the host (making sure to build for `linux/amd64`). Copy `share/container.tar.gz` and `share/image-id.txt` from the host into the `share` folder in the VM.
|
||||||
|
@ -335,12 +230,17 @@ Rename `Dangerzone.msi` to `Dangerzone-$VERSION.msi`.
|
||||||
|
|
||||||
### Linux release
|
### Linux release
|
||||||
|
|
||||||
> [!INFO]
|
> [!TIP]
|
||||||
> Below we explain how we build packages for each Linux distribution we support.
|
> You can automate these steps from any Linux distribution with:
|
||||||
>
|
>
|
||||||
> There is also a `release.sh` script available which creates all
|
> ```
|
||||||
> the `.rpm` and `.deb` files with a single command.
|
> doit clean
|
||||||
|
> doit -n 8 fedora_rpm debian_deb
|
||||||
|
> ```
|
||||||
|
>
|
||||||
|
> You can then add the created artifacts to the appropriate APT/YUM repo.
|
||||||
|
|
||||||
|
Below we explain how we build packages for each Linux distribution we support.
|
||||||
|
|
||||||
#### Debian/Ubuntu
|
#### Debian/Ubuntu
|
||||||
|
|
||||||
|
@ -353,21 +253,15 @@ instructions in our build section](https://github.com/freedomofpress/dangerzone/
|
||||||
or create your own locally with:
|
or create your own locally with:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
|
# Create and run debian bookworm development environment
|
||||||
./dev_scripts/env.py --distro debian --version bookworm build-dev
|
./dev_scripts/env.py --distro debian --version bookworm build-dev
|
||||||
./dev_scripts/env.py --distro debian --version bookworm run --dev bash
|
./dev_scripts/env.py --distro debian --version bookworm run --dev bash
|
||||||
cd dangerzone
|
|
||||||
```
|
|
||||||
|
|
||||||
Build the latest container:
|
# Build the latest container
|
||||||
|
./dev_scripts/env.py --distro debian --version bookworm run --dev bash -c "cd dangerzone && poetry run ./install/common/build-image.py"
|
||||||
|
|
||||||
```sh
|
# Create a .deb
|
||||||
python3 ./install/common/build-image.py
|
./dev_scripts/env.py --distro debian --version bookworm run --dev bash -c "cd dangerzone && ./install/linux/build-deb.py"
|
||||||
```
|
|
||||||
|
|
||||||
Create a .deb:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
./install/linux/build-deb.py
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Publish the .deb under `./deb_dist` to the
|
Publish the .deb under `./deb_dist` to the
|
||||||
|
@ -386,22 +280,12 @@ or create your own locally with:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
./dev_scripts/env.py --distro fedora --version 41 build-dev
|
./dev_scripts/env.py --distro fedora --version 41 build-dev
|
||||||
./dev_scripts/env.py --distro fedora --version 41 run --dev bash
|
|
||||||
cd dangerzone
|
|
||||||
```
|
|
||||||
|
|
||||||
Build the latest container:
|
# Build the latest container (skip if already built):
|
||||||
|
./dev_scripts/env.py --distro fedora --version 41 run --dev bash -c "cd dangerzone && poetry run ./install/common/build-image.py"
|
||||||
|
|
||||||
```sh
|
# Create a .rpm:
|
||||||
python3 ./install/common/build-image.py
|
./dev_scripts/env.py --distro fedora --version 41 run --dev bash -c "cd dangerzone && ./install/linux/build-rpm.py"
|
||||||
```
|
|
||||||
|
|
||||||
Copy the container image to the assets folder on `dangerzone-$VERSION-i686.tar.gz`.
|
|
||||||
|
|
||||||
Create a .rpm:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
./install/linux/build-rpm.py
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Publish the .rpm under `./dist` to the
|
Publish the .rpm under `./dist` to the
|
||||||
|
@ -412,7 +296,7 @@ Publish the .rpm under `./dist` to the
|
||||||
Create a .rpm for Qubes:
|
Create a .rpm for Qubes:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
./install/linux/build-rpm.py --qubes
|
./dev_scripts/env.py --distro fedora --version 41 run --dev bash -c "cd dangerzone && ./install/linux/build-rpm.py --qubes"
|
||||||
```
|
```
|
||||||
|
|
||||||
and similarly publish it to the [`freedomofpress/yum-tools-prod`](https://github.com/freedomofpress/yum-tools-prod)
|
and similarly publish it to the [`freedomofpress/yum-tools-prod`](https://github.com/freedomofpress/yum-tools-prod)
|
||||||
|
@ -420,36 +304,37 @@ repo.
|
||||||
|
|
||||||
## Publishing the Release
|
## Publishing the Release
|
||||||
|
|
||||||
To publish the release:
|
To publish the release, you can follow these steps:
|
||||||
|
|
||||||
- [ ] Create an archive of the Dangerzone source in `tar.gz` format:
|
- [ ] Create an archive of the Dangerzone source in `tar.gz` format:
|
||||||
* You can use the following command:
|
```bash
|
||||||
|
export VERSION=$(cat share/version.txt)
|
||||||
```
|
git archive --format=tar.gz -o dangerzone-${VERSION:?}.tar.gz --prefix=dangerzone/ v${VERSION:?}
|
||||||
export DZ_VERSION=$(cat share/version.txt)
|
```
|
||||||
git archive --format=tar.gz -o dangerzone-${DZ_VERSION:?}.tar.gz --prefix=dangerzone/ v${DZ_VERSION:?}
|
|
||||||
```
|
|
||||||
|
|
||||||
- [ ] Run container scan on the produced container images (some time may have passed since the artifacts were built)
|
- [ ] Run container scan on the produced container images (some time may have passed since the artifacts were built)
|
||||||
```
|
```bash
|
||||||
gunzip --keep -c ./share/container.tar.gz > /tmp/container.tar
|
gunzip --keep -c ./share/container.tar.gz > /tmp/container.tar
|
||||||
docker pull anchore/grype:latest
|
docker pull anchore/grype:latest
|
||||||
docker run --rm -v /tmp/container.tar:/container.tar anchore/grype:latest /container.tar
|
docker run --rm -v /tmp/container.tar:/container.tar anchore/grype:latest /container.tar
|
||||||
```
|
```
|
||||||
|
|
||||||
- [ ] Collect the assets in a single directory, calculate their SHA-256 hashes, and sign them.
|
- [ ] Collect the assets in a single directory, calculate their SHA-256 hashes, and sign them.
|
||||||
* You can use `./dev_scripts/sign-assets.py`, if you want to automate this
|
There is an `./dev_scripts/sign-assets.py` script to automate this task.
|
||||||
task.
|
|
||||||
- [ ] Create a new **draft** release on GitHub and upload the macOS and Windows installers.
|
|
||||||
* Copy the release notes text from the template at [`docs/templates/release-notes`](https://github.com/freedomofpress/dangerzone/tree/main/docs/templates/)
|
|
||||||
* You can use `./dev_scripts/upload-asset.py`, if you want to upload an asset
|
|
||||||
using an access token.
|
|
||||||
- [ ] Upload the `container-$VERSION-i686.tar.gz` and `container-$VERSION-arm64.tar.gz` images that were created in the previous step
|
|
||||||
|
|
||||||
**Important:** Make sure that it's the same container images as the ones that
|
**Important:** Before running the script, make sure that it's the same container images as
|
||||||
are shipped in other platforms (see our [Pre-release](#Pre-release) section)
|
the ones that are shipped in other platforms (see our [Pre-release](#Pre-release) section)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Sign all the assets
|
||||||
|
./dev_scripts/sign-assets.py ~/release-assets/$VERSION/github --version $VERSION
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] Upload all the assets to the draft release on GitHub.
|
||||||
|
```bash
|
||||||
|
find ~/release-assets/$VERSION/github | xargs -n1 ./dev_scripts/upload-asset.py --token ~/token --draft
|
||||||
|
```
|
||||||
|
|
||||||
- [ ] Upload the detached signatures (.asc) and checksum file.
|
|
||||||
- [ ] Update the [Dangerzone website](https://github.com/freedomofpress/dangerzone.rocks) to link to the new installers.
|
- [ ] Update the [Dangerzone website](https://github.com/freedomofpress/dangerzone.rocks) to link to the new installers.
|
||||||
- [ ] Update the brew cask release of Dangerzone with a [PR like this one](https://github.com/Homebrew/homebrew-cask/pull/116319)
|
- [ ] Update the brew cask release of Dangerzone with a [PR like this one](https://github.com/Homebrew/homebrew-cask/pull/116319)
|
||||||
- [ ] Update version and download links in `README.md`
|
- [ ] Update version and download links in `README.md`
|
||||||
|
|
67
dev_scripts/generate-release-tasks.py
Executable file
67
dev_scripts/generate-release-tasks.py
Executable file
|
@ -0,0 +1,67 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
import pathlib
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
RELEASE_FILE = "RELEASE.md"
|
||||||
|
QA_FILE = "QA.md"
|
||||||
|
|
||||||
|
|
||||||
|
def git_root():
|
||||||
|
"""Get the root directory of the Git repo."""
|
||||||
|
# FIXME: Use a Git Python binding for this.
|
||||||
|
# FIXME: Make this work if called outside the repo.
|
||||||
|
path = (
|
||||||
|
subprocess.run(
|
||||||
|
["git", "rev-parse", "--show-toplevel"],
|
||||||
|
check=True,
|
||||||
|
stdout=subprocess.PIPE,
|
||||||
|
)
|
||||||
|
.stdout.decode()
|
||||||
|
.strip("\n")
|
||||||
|
)
|
||||||
|
return pathlib.Path(path)
|
||||||
|
|
||||||
|
|
||||||
|
def extract_checkboxes(filename):
|
||||||
|
headers = []
|
||||||
|
result = []
|
||||||
|
|
||||||
|
with open(filename, "r") as f:
|
||||||
|
lines = f.readlines()
|
||||||
|
|
||||||
|
current_level = 0
|
||||||
|
for line in lines:
|
||||||
|
line = line.rstrip()
|
||||||
|
|
||||||
|
# If it's a header, store it
|
||||||
|
if line.startswith("#"):
|
||||||
|
# Count number of # to determine header level
|
||||||
|
level = len(line) - len(line.lstrip("#"))
|
||||||
|
if level < current_level or not current_level:
|
||||||
|
headers.extend(["", line, ""])
|
||||||
|
current_level = level
|
||||||
|
elif level > current_level:
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
headers = ["", line, ""]
|
||||||
|
|
||||||
|
# If it's a checkbox
|
||||||
|
elif "- [ ]" in line or "- [x]" in line or "- [X]" in line:
|
||||||
|
# Print the last header if we haven't already
|
||||||
|
if headers:
|
||||||
|
result.extend(headers)
|
||||||
|
headers = []
|
||||||
|
current_level = 0
|
||||||
|
|
||||||
|
# If this is the "Do the QA tasks" line, recursively get QA tasks
|
||||||
|
if "Do the QA tasks" in line:
|
||||||
|
result.append(line)
|
||||||
|
qa_tasks = extract_checkboxes(git_root() / QA_FILE)
|
||||||
|
result.append(qa_tasks)
|
||||||
|
else:
|
||||||
|
result.append(line)
|
||||||
|
return "\n".join(result)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
print(extract_checkboxes(git_root() / RELEASE_FILE))
|
|
@ -20,17 +20,32 @@ EOL_PYTHON_URL = "https://endoflife.date/api/python.json"
|
||||||
CONTENT_QA = r"""## QA
|
CONTENT_QA = r"""## QA
|
||||||
|
|
||||||
To ensure that new releases do not introduce regressions, and support existing
|
To ensure that new releases do not introduce regressions, and support existing
|
||||||
and newer platforms, we have to do the following:
|
and newer platforms, we have to test that the produced packages work as expected.
|
||||||
|
|
||||||
|
Check the following:
|
||||||
|
|
||||||
- [ ] Make sure that the tip of the `main` branch passes the CI tests.
|
- [ ] Make sure that the tip of the `main` branch passes the CI tests.
|
||||||
- [ ] Make sure that the Apple account has a valid application password and has
|
- [ ] Make sure that the Apple account has a valid application password and has
|
||||||
agreed to the latest Apple terms (see [macOS release](#macos-release)
|
agreed to the latest Apple terms (see [macOS release](#macos-release)
|
||||||
section).
|
section).
|
||||||
|
|
||||||
|
Because it is repetitive, we wrote a script to help with the QA.
|
||||||
|
It can run the tasks for you, pausing when it needs manual intervention.
|
||||||
|
|
||||||
|
You can run it with a command like:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
poetry run ./dev_scripts/qa.py {distro}-{version}
|
||||||
|
```
|
||||||
|
|
||||||
|
### The checklist
|
||||||
|
|
||||||
- [ ] Create a test build in Windows and make sure it works:
|
- [ ] Create a test build in Windows and make sure it works:
|
||||||
- [ ] Check if the suggested Python version is still supported.
|
- [ ] Check if the suggested Python version is still supported.
|
||||||
- [ ] Create a new development environment with Poetry.
|
- [ ] Create a new development environment with Poetry.
|
||||||
- [ ] Build the container image and ensure the development environment uses
|
- [ ] Build the container image and ensure the development environment uses
|
||||||
the new image.
|
the new image.
|
||||||
|
- [ ] Download the OCR language data using `./install/common/download-tessdata.py`
|
||||||
- [ ] Run the Dangerzone tests.
|
- [ ] Run the Dangerzone tests.
|
||||||
- [ ] Build and run the Dangerzone .exe
|
- [ ] Build and run the Dangerzone .exe
|
||||||
- [ ] Test some QA scenarios (see [Scenarios](#Scenarios) below).
|
- [ ] Test some QA scenarios (see [Scenarios](#Scenarios) below).
|
||||||
|
@ -39,6 +54,7 @@ and newer platforms, we have to do the following:
|
||||||
- [ ] Create a new development environment with Poetry.
|
- [ ] Create a new development environment with Poetry.
|
||||||
- [ ] Build the container image and ensure the development environment uses
|
- [ ] Build the container image and ensure the development environment uses
|
||||||
the new image.
|
the new image.
|
||||||
|
- [ ] Download the OCR language data using `./install/common/download-tessdata.py`
|
||||||
- [ ] Run the Dangerzone tests.
|
- [ ] Run the Dangerzone tests.
|
||||||
- [ ] Create and run an app bundle.
|
- [ ] Create and run an app bundle.
|
||||||
- [ ] Test some QA scenarios (see [Scenarios](#Scenarios) below).
|
- [ ] Test some QA scenarios (see [Scenarios](#Scenarios) below).
|
||||||
|
@ -47,6 +63,7 @@ and newer platforms, we have to do the following:
|
||||||
- [ ] Create a new development environment with Poetry.
|
- [ ] Create a new development environment with Poetry.
|
||||||
- [ ] Build the container image and ensure the development environment uses
|
- [ ] Build the container image and ensure the development environment uses
|
||||||
the new image.
|
the new image.
|
||||||
|
- [ ] Download the OCR language data using `./install/common/download-tessdata.py`
|
||||||
- [ ] Run the Dangerzone tests.
|
- [ ] Run the Dangerzone tests.
|
||||||
- [ ] Create and run an app bundle.
|
- [ ] Create and run an app bundle.
|
||||||
- [ ] Test some QA scenarios (see [Scenarios](#Scenarios) below).
|
- [ ] Test some QA scenarios (see [Scenarios](#Scenarios) below).
|
||||||
|
@ -55,6 +72,7 @@ and newer platforms, we have to do the following:
|
||||||
- [ ] Create a new development environment with Poetry.
|
- [ ] Create a new development environment with Poetry.
|
||||||
- [ ] Build the container image and ensure the development environment uses
|
- [ ] Build the container image and ensure the development environment uses
|
||||||
the new image.
|
the new image.
|
||||||
|
- [ ] Download the OCR language data using `./install/common/download-tessdata.py`
|
||||||
- [ ] Run the Dangerzone tests.
|
- [ ] Run the Dangerzone tests.
|
||||||
- [ ] Create a .deb package and install it system-wide.
|
- [ ] Create a .deb package and install it system-wide.
|
||||||
- [ ] Test some QA scenarios (see [Scenarios](#Scenarios) below).
|
- [ ] Test some QA scenarios (see [Scenarios](#Scenarios) below).
|
||||||
|
@ -63,6 +81,7 @@ and newer platforms, we have to do the following:
|
||||||
- [ ] Create a new development environment with Poetry.
|
- [ ] Create a new development environment with Poetry.
|
||||||
- [ ] Build the container image and ensure the development environment uses
|
- [ ] Build the container image and ensure the development environment uses
|
||||||
the new image.
|
the new image.
|
||||||
|
- [ ] Download the OCR language data using `./install/common/download-tessdata.py`
|
||||||
- [ ] Run the Dangerzone tests.
|
- [ ] Run the Dangerzone tests.
|
||||||
- [ ] Create an .rpm package and install it system-wide.
|
- [ ] Create an .rpm package and install it system-wide.
|
||||||
- [ ] Test some QA scenarios (see [Scenarios](#Scenarios) below).
|
- [ ] Test some QA scenarios (see [Scenarios](#Scenarios) below).
|
||||||
|
@ -555,7 +574,7 @@ class Reference:
|
||||||
# Convert spaces to dashes
|
# Convert spaces to dashes
|
||||||
anchor = anchor.replace(" ", "-")
|
anchor = anchor.replace(" ", "-")
|
||||||
# Remove non-alphanumeric (except dash and underscore)
|
# Remove non-alphanumeric (except dash and underscore)
|
||||||
anchor = re.sub("[^a-zA-Z\-_]", "", anchor)
|
anchor = re.sub("[^a-zA-Z-_]", "", anchor)
|
||||||
|
|
||||||
return anchor
|
return anchor
|
||||||
|
|
||||||
|
@ -574,8 +593,8 @@ class QABase(abc.ABC):
|
||||||
|
|
||||||
platforms = {}
|
platforms = {}
|
||||||
|
|
||||||
REF_QA = Reference("RELEASE.md", content=CONTENT_QA)
|
REF_QA = Reference("QA.md", content=CONTENT_QA)
|
||||||
REF_QA_SCENARIOS = Reference("RELEASE.md", content=CONTENT_QA_SCENARIOS)
|
REF_QA_SCENARIOS = Reference("QA.md", content=CONTENT_QA_SCENARIOS)
|
||||||
|
|
||||||
# The following class method is available since Python 3.6. For more details, see:
|
# The following class method is available since Python 3.6. For more details, see:
|
||||||
# https://docs.python.org/3.6/whatsnew/3.6.html#pep-487-simpler-customization-of-class-creation
|
# https://docs.python.org/3.6/whatsnew/3.6.html#pep-487-simpler-customization-of-class-creation
|
||||||
|
@ -1053,6 +1072,10 @@ class QAFedora(QALinux):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class QAFedora41(QAFedora):
|
||||||
|
VERSION = "41"
|
||||||
|
|
||||||
|
|
||||||
class QAFedora40(QAFedora):
|
class QAFedora40(QAFedora):
|
||||||
VERSION = "40"
|
VERSION = "40"
|
||||||
|
|
||||||
|
|
58
docs/developer/doit.md
Normal file
58
docs/developer/doit.md
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
# Using the Doit Automation Tool
|
||||||
|
|
||||||
|
Developers can use the [Doit](https://pydoit.org/) automation tool to create
|
||||||
|
release artifacts. The purpose of the tool is to automate our manual release
|
||||||
|
instructions in `RELEASE.md` file. Not everything is automated yet, since we're
|
||||||
|
still experimenting with this tool. You can find our task definitions in this
|
||||||
|
repo's `dodo.py` file.
|
||||||
|
|
||||||
|
## Why Doit?
|
||||||
|
|
||||||
|
We picked Doit out of the various tools out there for the following reasons:
|
||||||
|
|
||||||
|
* **Pythonic:** The configuration file and tasks can be written in Python. Where
|
||||||
|
applicable, it's easy to issue shell commands as well.
|
||||||
|
* **File targets:** Doit borrows the file target concept from Makefiles. Tasks
|
||||||
|
can have file dependencies, and targets they build. This makes it easy to
|
||||||
|
define a dependency graph (DAG) for tasks.
|
||||||
|
* **Hash-based caching:** Unlike Makefiles, doit does not look at the
|
||||||
|
modification timestamp of source/target files, to figure out if it needs to
|
||||||
|
run them. Instead, it hashes those files, and will run a task only if the
|
||||||
|
hash of a file dependency has changed.
|
||||||
|
* **Parallelization:** Tasks can be run in parallel with the `-n` argument,
|
||||||
|
which is similar to `make`'s `-j` argument.
|
||||||
|
|
||||||
|
## How to Doit?
|
||||||
|
|
||||||
|
First, enter your Poetry shell. Then, make sure that your environment is clean,
|
||||||
|
and you have ample disk space. You can run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
doit clean --dry-run # if you want to see what would happen
|
||||||
|
doit clean # you'll be asked to cofirm that you want to clean everything
|
||||||
|
```
|
||||||
|
|
||||||
|
Finally, you can build all the release artifacts with `doit`, or a specific task
|
||||||
|
with:
|
||||||
|
|
||||||
|
```
|
||||||
|
doit <task>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tips and tricks
|
||||||
|
|
||||||
|
* You can run `doit list --all -s` to see the full list of tasks, their
|
||||||
|
dependencies, and whether they are up to date.
|
||||||
|
* You can run `doit info <task>` to see which dependencies are missing.
|
||||||
|
* You can change this line in `pyproject.toml` to `true`, to allow using the
|
||||||
|
Docker/Podman build cache:
|
||||||
|
|
||||||
|
```
|
||||||
|
use_cache = true
|
||||||
|
```
|
||||||
|
|
||||||
|
* You can pass the following global parameters with `doit <param>=<value>`:
|
||||||
|
- `runtime`: The container runtime to use. Either `podman` or `docker`
|
||||||
|
- `release_dir`: Where to store the release artifacts. Default path is
|
||||||
|
`~/release-assets/<version>`
|
||||||
|
- `apple_id`: The Apple ID to use when signing/notarizing the macOS DMG.
|
106
dodo.py
106
dodo.py
|
@ -12,17 +12,23 @@ VERSION = open("share/version.txt").read().strip()
|
||||||
FEDORA_VERSIONS = ["40", "41"]
|
FEDORA_VERSIONS = ["40", "41"]
|
||||||
DEBIAN_VERSIONS = ["bullseye", "focal", "jammy", "mantic", "noble", "trixie"]
|
DEBIAN_VERSIONS = ["bullseye", "focal", "jammy", "mantic", "noble", "trixie"]
|
||||||
|
|
||||||
# In the case of an Apple Silicon machine, there's no need to run anything else than
|
### Global parameters
|
||||||
# building the .dmg.
|
#
|
||||||
if ARCH == "arm64":
|
# Read more about global parameters in
|
||||||
DOIT_CONFIG = {'default_tasks': ['macos_build_dmg']}
|
# https://pydoit.org/task-args.html#command-line-variables-doit-get-var
|
||||||
|
|
||||||
|
CONTAINER_RUNTIME = get_var("runtime", "podman")
|
||||||
|
DEFAULT_RELEASE_DIR = Path.home() / "release-assets" / VERSION
|
||||||
|
# XXX: Workaround for https://github.com/pydoit/doit/issues/164
|
||||||
|
RELEASE_DIR = Path(get_var("release_dir", None) or DEFAULT_RELEASE_DIR)
|
||||||
|
APPLE_ID = get_var("apple_id", None)
|
||||||
|
|
||||||
### Task Parameters
|
### Task Parameters
|
||||||
|
|
||||||
PARAM_APPLE_ID = {
|
PARAM_APPLE_ID = {
|
||||||
"name": "apple_id",
|
"name": "apple_id",
|
||||||
"long": "apple-id",
|
"long": "apple-id",
|
||||||
"default": "fpf@example.com",
|
"default": APPLE_ID,
|
||||||
"help": "The Apple developer ID that will be used for signing the .dmg",
|
"help": "The Apple developer ID that will be used for signing the .dmg",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,19 +42,12 @@ PARAM_USE_CACHE = {
|
||||||
"default": False,
|
"default": False,
|
||||||
}
|
}
|
||||||
|
|
||||||
### Global parameters
|
|
||||||
#
|
|
||||||
# Read more about global parameters in
|
|
||||||
# https://pydoit.org/task-args.html#command-line-variables-doit-get-var
|
|
||||||
|
|
||||||
CONTAINER_RUNTIME = get_var('runtime', 'podman')
|
|
||||||
RELEASE_DIR = Path(get_var("release_dir", Path.home() / "release-assets" / VERSION))
|
|
||||||
|
|
||||||
### File dependencies
|
### File dependencies
|
||||||
#
|
#
|
||||||
# Define all the file dependencies we'll see later in tasks here, since some file
|
# Define all the file dependencies for our tasks in a single place, since some file
|
||||||
# dependencies are shared between tasks.
|
# dependencies are shared between tasks.
|
||||||
|
|
||||||
|
|
||||||
def list_files(path, recursive=False):
|
def list_files(path, recursive=False):
|
||||||
"""List files in a directory, and optionally traverse into subdirectories."""
|
"""List files in a directory, and optionally traverse into subdirectories."""
|
||||||
filepaths = []
|
filepaths = []
|
||||||
|
@ -118,7 +117,6 @@ def copy_dir(src, dst):
|
||||||
|
|
||||||
def create_release_dir():
|
def create_release_dir():
|
||||||
RELEASE_DIR.mkdir(parents=True, exist_ok=True)
|
RELEASE_DIR.mkdir(parents=True, exist_ok=True)
|
||||||
(RELEASE_DIR / "assets").mkdir(exist_ok=True)
|
|
||||||
(RELEASE_DIR / "tmp").mkdir(exist_ok=True)
|
(RELEASE_DIR / "tmp").mkdir(exist_ok=True)
|
||||||
|
|
||||||
|
|
||||||
|
@ -152,6 +150,9 @@ def build_rpm(version, cwd, qubes=False):
|
||||||
return build_linux_pkg(distro="Fedora", version=version, cwd=cwd, qubes=qubes)
|
return build_linux_pkg(distro="Fedora", version=version, cwd=cwd, qubes=qubes)
|
||||||
|
|
||||||
|
|
||||||
|
### Tasks
|
||||||
|
|
||||||
|
|
||||||
def task_clean_container_runtime():
|
def task_clean_container_runtime():
|
||||||
"""Clean the storage space of the container runtime."""
|
"""Clean the storage space of the container runtime."""
|
||||||
return {
|
return {
|
||||||
|
@ -186,10 +187,7 @@ def task_macos_check_system():
|
||||||
"""Run macOS specific system checks, as well as the generic ones."""
|
"""Run macOS specific system checks, as well as the generic ones."""
|
||||||
return {
|
return {
|
||||||
"actions": None,
|
"actions": None,
|
||||||
"task_dep": [
|
"task_dep": ["check_container_runtime", "macos_check_cert"],
|
||||||
"check_container_runtime",
|
|
||||||
"macos_check_cert",
|
|
||||||
],
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -221,29 +219,24 @@ def task_build_image():
|
||||||
return {
|
return {
|
||||||
"actions": [
|
"actions": [
|
||||||
f"python install/common/build-image.py --use-cache=%(use_cache)s --runtime={CONTAINER_RUNTIME}",
|
f"python install/common/build-image.py --use-cache=%(use_cache)s --runtime={CONTAINER_RUNTIME}",
|
||||||
f"cp {img_src} {img_dst}",
|
["cp", img_src, img_dst],
|
||||||
f"cp {img_id_src} {img_id_dst}",
|
["cp", img_id_src, img_id_dst],
|
||||||
],
|
],
|
||||||
"params": [PARAM_USE_CACHE],
|
"params": [PARAM_USE_CACHE],
|
||||||
"file_dep": IMAGE_DEPS,
|
"file_dep": IMAGE_DEPS,
|
||||||
"targets": [img_src, img_dst, img_id_src, img_id_dst],
|
"targets": [img_src, img_dst, img_id_src, img_id_dst],
|
||||||
"task_dep": [
|
"task_dep": ["init_release_dir", "check_container_runtime"],
|
||||||
"init_release_dir",
|
|
||||||
"check_container_runtime",
|
|
||||||
],
|
|
||||||
"clean": True,
|
"clean": True,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def task_poetry_install():
|
def task_poetry_install():
|
||||||
"""Setup the Poetry environment"""
|
"""Setup the Poetry environment"""
|
||||||
return {
|
return {"actions": ["poetry install --sync"], "clean": ["poetry env remove --all"]}
|
||||||
"actions": ["poetry install --sync"],
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def task_macos_build_dmg():
|
def task_macos_build_dmg():
|
||||||
"""Build the macOS app bundle for Dangerzone."""
|
"""Build the macOS .dmg file for Dangerzone."""
|
||||||
dz_dir = RELEASE_DIR / "tmp" / "macos"
|
dz_dir = RELEASE_DIR / "tmp" / "macos"
|
||||||
dmg_src = dz_dir / "dist" / "Dangerzone.dmg"
|
dmg_src = dz_dir / "dist" / "Dangerzone.dmg"
|
||||||
dmg_dst = RELEASE_DIR / f"Dangerzone-{VERSION}-{ARCH}.dmg" # FIXME: Add -arch
|
dmg_dst = RELEASE_DIR / f"Dangerzone-{VERSION}-{ARCH}.dmg" # FIXME: Add -arch
|
||||||
|
@ -257,17 +250,18 @@ def task_macos_build_dmg():
|
||||||
f" --keychain-profile dz-notarytool-release-key {dmg_src}"
|
f" --keychain-profile dz-notarytool-release-key {dmg_src}"
|
||||||
),
|
),
|
||||||
f"xcrun stapler staple {dmg_src}",
|
f"xcrun stapler staple {dmg_src}",
|
||||||
["cp", "-r", dmg_src, dmg_dst],
|
["cp", dmg_src, dmg_dst],
|
||||||
["rm", "-rf", dz_dir],
|
["rm", "-rf", dz_dir],
|
||||||
],
|
],
|
||||||
"params": [PARAM_APPLE_ID],
|
"params": [PARAM_APPLE_ID],
|
||||||
"file_dep": DMG_DEPS,
|
"file_dep": DMG_DEPS,
|
||||||
"task_dep": [
|
"task_dep": [
|
||||||
|
"macos_check_system",
|
||||||
"init_release_dir",
|
"init_release_dir",
|
||||||
"poetry_install",
|
"poetry_install",
|
||||||
"download_tessdata",
|
"download_tessdata",
|
||||||
],
|
],
|
||||||
"targets": [dmg_dst],
|
"targets": [dmg_src, dmg_dst],
|
||||||
"clean": True,
|
"clean": True,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -305,10 +299,7 @@ def task_debian_deb():
|
||||||
["rm", "-rf", dz_dir],
|
["rm", "-rf", dz_dir],
|
||||||
],
|
],
|
||||||
"file_dep": DEB_DEPS,
|
"file_dep": DEB_DEPS,
|
||||||
"task_dep": [
|
"task_dep": ["init_release_dir", "debian_env"],
|
||||||
"init_release_dir",
|
|
||||||
"debian_env",
|
|
||||||
],
|
|
||||||
"targets": [deb_dst],
|
"targets": [deb_dst],
|
||||||
"clean": True,
|
"clean": True,
|
||||||
}
|
}
|
||||||
|
@ -319,6 +310,7 @@ def task_fedora_env():
|
||||||
for version in FEDORA_VERSIONS:
|
for version in FEDORA_VERSIONS:
|
||||||
yield {
|
yield {
|
||||||
"name": version,
|
"name": version,
|
||||||
|
"doc": f"Build Fedora {version} dev environments",
|
||||||
"actions": [
|
"actions": [
|
||||||
[
|
[
|
||||||
"python3",
|
"python3",
|
||||||
|
@ -339,6 +331,7 @@ def task_fedora_rpm():
|
||||||
for version in FEDORA_VERSIONS:
|
for version in FEDORA_VERSIONS:
|
||||||
for qubes in (True, False):
|
for qubes in (True, False):
|
||||||
qubes_ident = "-qubes" if qubes else ""
|
qubes_ident = "-qubes" if qubes else ""
|
||||||
|
qubes_desc = " for Qubes" if qubes else ""
|
||||||
dz_dir = RELEASE_DIR / "tmp" / f"f{version}{qubes_ident}"
|
dz_dir = RELEASE_DIR / "tmp" / f"f{version}{qubes_ident}"
|
||||||
rpm_names = [
|
rpm_names = [
|
||||||
f"dangerzone{qubes_ident}-{VERSION}-1.fc{version}.x86_64.rpm",
|
f"dangerzone{qubes_ident}-{VERSION}-1.fc{version}.x86_64.rpm",
|
||||||
|
@ -349,6 +342,7 @@ def task_fedora_rpm():
|
||||||
|
|
||||||
yield {
|
yield {
|
||||||
"name": version + qubes_ident,
|
"name": version + qubes_ident,
|
||||||
|
"doc": f"Build a Fedora {version} package{qubes_desc}",
|
||||||
"actions": [
|
"actions": [
|
||||||
(copy_dir, [".", dz_dir]),
|
(copy_dir, [".", dz_dir]),
|
||||||
build_rpm(version, cwd=dz_dir, qubes=qubes),
|
build_rpm(version, cwd=dz_dir, qubes=qubes),
|
||||||
|
@ -356,10 +350,7 @@ def task_fedora_rpm():
|
||||||
["rm", "-rf", dz_dir],
|
["rm", "-rf", dz_dir],
|
||||||
],
|
],
|
||||||
"file_dep": RPM_DEPS,
|
"file_dep": RPM_DEPS,
|
||||||
"task_dep": [
|
"task_dep": ["init_release_dir", f"fedora_env:{version}"],
|
||||||
"init_release_dir",
|
|
||||||
f"fedora_env:{version}",
|
|
||||||
],
|
|
||||||
"targets": rpm_dst,
|
"targets": rpm_dst,
|
||||||
"clean": True,
|
"clean": True,
|
||||||
}
|
}
|
||||||
|
@ -375,3 +366,40 @@ def task_git_archive():
|
||||||
"targets": [target],
|
"targets": [target],
|
||||||
"task_dep": ["init_release_dir"],
|
"task_dep": ["init_release_dir"],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#######################################################################################
|
||||||
|
#
|
||||||
|
# END OF TASKS
|
||||||
|
#
|
||||||
|
# The following task should be the LAST one in the dodo file, so that it runs first when
|
||||||
|
# running `do clean`.
|
||||||
|
|
||||||
|
|
||||||
|
def clean_prompt():
|
||||||
|
ans = input(
|
||||||
|
f"""
|
||||||
|
You have not specified a target to clean.
|
||||||
|
This means that doit will clean the following targets:
|
||||||
|
|
||||||
|
* ALL the containers, images, and build cache in {CONTAINER_RUNTIME.capitalize()}
|
||||||
|
* ALL the built targets and directories
|
||||||
|
|
||||||
|
For a full list of the targets that doit will clean, run: doit clean --dry-run
|
||||||
|
|
||||||
|
Are you sure you want to clean everything (y/N): \
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
if ans.lower() in ["yes", "y"]:
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
print("Exiting...")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
def task_clean_prompt():
|
||||||
|
"""Make sure that the user really wants to run the clean tasks."""
|
||||||
|
return {
|
||||||
|
"actions": None,
|
||||||
|
"clean": [clean_prompt],
|
||||||
|
}
|
||||||
|
|
|
@ -17,15 +17,16 @@ elif platform.system() == "Linux":
|
||||||
|
|
||||||
ARCH = platform.machine()
|
ARCH = platform.machine()
|
||||||
|
|
||||||
|
|
||||||
def str2bool(v):
|
def str2bool(v):
|
||||||
if isinstance(v, bool):
|
if isinstance(v, bool):
|
||||||
return v
|
return v
|
||||||
if v.lower() in ('yes', 'true', 't', 'y', '1'):
|
if v.lower() in ("yes", "true", "t", "y", "1"):
|
||||||
return True
|
return True
|
||||||
elif v.lower() in ('no', 'false', 'f', 'n', '0'):
|
elif v.lower() in ("no", "false", "f", "n", "0"):
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
raise argparse.ArgumentTypeError('Boolean value expected.')
|
raise argparse.ArgumentTypeError("Boolean value expected.")
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
@ -51,7 +52,7 @@ def main():
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"--use-cache",
|
"--use-cache",
|
||||||
type=str2bool,
|
type=str2bool,
|
||||||
nargs='?',
|
nargs="?",
|
||||||
default=False,
|
default=False,
|
||||||
const=True,
|
const=True,
|
||||||
help="Use the builder's cache to speed up the builds (not suitable for release builds)",
|
help="Use the builder's cache to speed up the builds (not suitable for release builds)",
|
||||||
|
|
2
poetry.lock
generated
2
poetry.lock
generated
|
@ -1210,4 +1210,4 @@ type = ["pytest-mypy"]
|
||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "2.0"
|
lock-version = "2.0"
|
||||||
python-versions = ">=3.9,<3.13"
|
python-versions = ">=3.9,<3.13"
|
||||||
content-hash = "8367cee9a978ba6df32f44e902d223156e321b2cb4ea8a9d7a4bf1f88392a8c0"
|
content-hash = "a2937fd8ead7b45da571cb943ab43918a9c6d3dcbc6935dc8d0af3d1d4190371"
|
||||||
|
|
|
@ -23,7 +23,6 @@ pyxdg = {version = "*", platform = "linux"}
|
||||||
requests = "*"
|
requests = "*"
|
||||||
markdown = "*"
|
markdown = "*"
|
||||||
packaging = "*"
|
packaging = "*"
|
||||||
doit = "^0.36.0"
|
|
||||||
|
|
||||||
[tool.poetry.scripts]
|
[tool.poetry.scripts]
|
||||||
dangerzone = 'dangerzone:main'
|
dangerzone = 'dangerzone:main'
|
||||||
|
@ -35,6 +34,7 @@ setuptools = "*"
|
||||||
cx_freeze = {version = "^7.2.5", platform = "win32"}
|
cx_freeze = {version = "^7.2.5", platform = "win32"}
|
||||||
pywin32 = {version = "*", platform = "win32"}
|
pywin32 = {version = "*", platform = "win32"}
|
||||||
pyinstaller = {version = "*", platform = "darwin"}
|
pyinstaller = {version = "*", platform = "darwin"}
|
||||||
|
doit = "^0.36.0"
|
||||||
|
|
||||||
# Dependencies required for linting the code.
|
# Dependencies required for linting the code.
|
||||||
[tool.poetry.group.lint.dependencies]
|
[tool.poetry.group.lint.dependencies]
|
||||||
|
@ -67,25 +67,12 @@ skip_gitignore = true
|
||||||
# This is necessary due to https://github.com/PyCQA/isort/issues/1835
|
# This is necessary due to https://github.com/PyCQA/isort/issues/1835
|
||||||
follow_links = false
|
follow_links = false
|
||||||
|
|
||||||
[tool.doit.commands.clean]
|
[tool.doit]
|
||||||
# XXX: Change this to false if you REALLY want to clean your environment. Note
|
verbosity = 3
|
||||||
# that this command will:
|
|
||||||
# * prune container images,
|
|
||||||
# * clean the Git repo, and
|
|
||||||
# * remove all tasks output
|
|
||||||
#
|
|
||||||
# Else, the `doit clean` comamnd will print the commands that would run instead.
|
|
||||||
dryrun = true
|
|
||||||
|
|
||||||
[tool.doit.tasks.macos_check_cert]
|
|
||||||
apple_id = "fpf@example.com"
|
|
||||||
|
|
||||||
[tool.doit.tasks.macos_codesign]
|
|
||||||
apple_id = "fpf@example.com"
|
|
||||||
|
|
||||||
[tool.doit.tasks.build_image]
|
[tool.doit.tasks.build_image]
|
||||||
|
# DO NOT change this to 'true' for release artifacts.
|
||||||
use_cache = false
|
use_cache = false
|
||||||
force_tag = ""
|
|
||||||
|
|
||||||
[build-system]
|
[build-system]
|
||||||
requires = ["poetry-core>=1.2.0"]
|
requires = ["poetry-core>=1.2.0"]
|
||||||
|
|
Loading…
Reference in a new issue