From cdb240f3d4d9c0d6d56e6660d8c45da4ab60ff59 Mon Sep 17 00:00:00 2001 From: Andrea Pappacoda Date: Sun, 15 May 2022 02:06:02 +0200 Subject: [PATCH 1/2] chore: make yuzu REUSE compliant [REUSE] is a specification that aims at making file copyright information consistent, so that it can be both human and machine readable. It basically requires that all files have a header containing copyright and licensing information. When this isn't possible, like when dealing with binary assets, generated files or embedded third-party dependencies, it is permitted to insert copyright information in the `.reuse/dep5` file. Oh, and it also requires that all the licenses used in the project are present in the `LICENSES` folder, that's why the diff is so huge. This can be done automatically with `reuse download --all`. The `reuse` tool also contains a handy subcommand that analyzes the project and tells whether or not the project is (still) compliant, `reuse lint`. Following REUSE has a few advantages over the current approach: - Copyright information is easy to access for users / downstream - Files like `dist/license.md` do not need to exist anymore, as `.reuse/dep5` is used instead - `reuse lint` makes it easy to ensure that copyright information of files like binary assets / images is always accurate and up to date To add copyright information of files that didn't have it I looked up who committed what and when, for each file. As yuzu contributors do not have to sign a CLA or similar I couldn't assume that copyright ownership was of the "yuzu Emulator Project", so I used the name and/or email of the commit author instead. [REUSE]: https://reuse.software Follow-up to 01cf05bc75b1e47beb08937439f3ed9339e7b254 --- .ci/scripts/clang/docker.sh | 3 + .ci/scripts/clang/exec.sh | 3 + .ci/scripts/clang/upload.sh | 3 + .ci/scripts/common/post-upload.sh | 7 +- .ci/scripts/common/pre-upload.sh | 3 + .ci/scripts/format/docker.sh | 3 + .ci/scripts/format/exec.sh | 3 + .ci/scripts/format/script.sh | 3 + .ci/scripts/linux/docker.sh | 3 + .ci/scripts/linux/exec.sh | 3 + .ci/scripts/linux/upload.sh | 3 + .../merge/apply-patches-by-label-private.py | 3 + .ci/scripts/merge/apply-patches-by-label.py | 3 + .ci/scripts/merge/check-label-presence.py | 3 + .ci/scripts/merge/yuzubot-git-config.sh | 3 + .ci/scripts/transifex/docker.sh | 3 + .ci/scripts/windows/docker.sh | 3 + .ci/scripts/windows/exec.sh | 3 + .ci/scripts/windows/scan_dll.py | 3 + .ci/scripts/windows/upload.ps1 | 5 +- .ci/scripts/windows/upload.sh | 3 + .ci/templates/build-mock.yml | 3 + .ci/templates/build-msvc.yml | 3 + .ci/templates/build-single.yml | 3 + .ci/templates/build-standard.yml | 3 + .ci/templates/build-testing.yml | 3 + .ci/templates/format-check.yml | 3 + .ci/templates/merge-private.yml | 3 + .ci/templates/merge.yml | 3 + .ci/templates/mergebot-private.yml | 3 + .ci/templates/mergebot.yml | 3 + .ci/templates/release-download.yml | 3 + .ci/templates/release-github.yml | 3 + .ci/templates/release-private-tag.yml | 3 + .ci/templates/release-universal.yml | 3 + .ci/templates/retrieve-artifact-source.yml | 3 + .ci/templates/retrieve-master-source.yml | 3 + .ci/templates/sync-source.yml | 3 + .ci/yuzu-mainline-step1.yml | 3 + .ci/yuzu-mainline-step2.yml | 3 + .ci/yuzu-patreon-step1.yml | 3 + .ci/yuzu-patreon-step2.yml | 3 + .ci/yuzu-repo-sync.yml | 3 + .ci/yuzu-verify.yml | 3 + .gitattributes | 3 + .github/FUNDING.yml | 3 + .../bug-report-feature-request.md | 5 + .github/ISSUE_TEMPLATE/config.yml | 3 + .github/workflows/ci.yml | 3 + .github/workflows/verify.yml | 3 + .gitignore | 3 + .gitmodules | 3 + .lgtm.yml | 3 + .reuse/dep5 | 106 ++++++ CMakeLists.txt | 3 + CMakeModules/CopyYuzuFFmpegDeps.cmake | 3 + CMakeModules/CopyYuzuQt5Deps.cmake | 3 + CMakeModules/CopyYuzuSDLDeps.cmake | 3 + CMakeModules/DownloadExternals.cmake | 2 + CMakeModules/GenerateSCMRev.cmake | 3 + CMakeModules/MSVCCache.cmake | 3 + CMakeModules/MinGWClangCross.cmake | 3 + CMakeModules/MinGWCross.cmake | 3 + CONTRIBUTING.md | 5 + Doxyfile | 3 + license.txt => LICENSE.txt | 2 +- LICENSES/Apache-2.0.txt | 73 +++++ LICENSES/BSD-2-Clause.txt | 9 + LICENSES/BSD-3-Clause.txt | 11 + LICENSES/BSL-1.0.txt | 7 + LICENSES/CC-BY-4.0.txt | 156 +++++++++ LICENSES/CC-BY-ND-3.0.txt | 87 +++++ LICENSES/CC0-1.0.txt | 121 +++++++ LICENSES/GPL-2.0-or-later.txt | 117 +++++++ LICENSES/GPL-3.0-or-later.txt | 232 +++++++++++++ LICENSES/LGPL-3.0-or-later.txt | 304 ++++++++++++++++++ LICENSES/MIT.txt | 9 + LICENSES/Unlicense.txt | 10 + LICENSES/WTFPL.txt | 11 + LICENSES/Zlib.txt | 11 + README.md | 7 +- .../compatibility_list/compatibility_list.qrc | 5 + dist/icons/controller/controller.qrc | 5 + dist/icons/overlay/overlay.qrc | 5 + dist/license.md | 44 --- dist/org.yuzu_emu.yuzu.desktop | 3 + dist/org.yuzu_emu.yuzu.metainfo.xml | 6 + dist/org.yuzu_emu.yuzu.xml | 6 + dist/qt_themes/colorful/style.qrc | 5 + dist/qt_themes/colorful_dark/style.qrc | 5 + .../colorful_midnight_blue/style.qrc | 5 + dist/qt_themes/default/default.qrc | 5 + dist/yuzu.manifest | 6 + externals/CMakeLists.txt | 3 +- .../GetGitRevisionDescription.cmake | 4 + .../GetGitRevisionDescription.cmake.in | 5 +- .../cmake-modules/WindowsCopyFiles.cmake | 5 +- externals/ffmpeg/CMakeLists.txt | 3 + externals/find-modules/FindCatch2.cmake | 2 + externals/find-modules/FindFFmpeg.cmake | 6 +- externals/find-modules/FindLibUSB.cmake | 5 +- externals/find-modules/Findfmt.cmake | 2 + externals/find-modules/Findlz4.cmake | 2 + .../find-modules/Findnlohmann_json.cmake | 2 + externals/find-modules/Findopus.cmake | 2 + externals/find-modules/Findzstd.cmake | 2 + externals/getopt/CMakeLists.txt | 3 + externals/glad/CMakeLists.txt | 3 + externals/glad/Readme.md | 5 + externals/inih/CMakeLists.txt | 3 + externals/libusb/CMakeLists.txt | 3 + externals/libusb/config.h.in | 5 + externals/opus/CMakeLists.txt | 3 + hooks/pre-commit | 3 + src/.clang-format | 3 + src/CMakeLists.txt | 3 + src/audio_core/CMakeLists.txt | 3 + src/common/CMakeLists.txt | 3 + src/common/alignment.h | 3 +- src/common/atomic_helpers.h | 5 +- src/common/detached_tasks.cpp | 5 +- src/common/detached_tasks.h | 5 +- src/common/error.cpp | 6 +- src/common/error.h | 6 +- src/common/fixed_point.h | 26 +- src/common/hash.h | 5 +- src/common/input.h | 5 +- src/common/logging/backend.cpp | 5 +- src/common/logging/backend.h | 5 +- src/common/logging/filter.cpp | 5 +- src/common/logging/filter.h | 5 +- src/common/logging/log.h | 5 +- src/common/logging/text_formatter.cpp | 5 +- src/common/logging/text_formatter.h | 5 +- src/common/microprofile.cpp | 5 +- src/common/microprofile.h | 5 +- src/common/microprofileui.h | 5 +- src/common/param_package.cpp | 5 +- src/common/param_package.h | 5 +- src/common/quaternion.h | 5 +- src/common/reader_writer_queue.h | 5 +- src/common/scm_rev.cpp.in | 5 +- src/common/scm_rev.h | 5 +- src/common/scope_exit.h | 5 +- src/common/telemetry.cpp | 5 +- src/common/telemetry.h | 5 +- src/common/x64/xbyak_abi.h | 5 +- src/common/x64/xbyak_util.h | 5 +- src/core/CMakeLists.txt | 3 + src/core/arm/arm_interface.h | 5 +- src/core/arm/dynarmic/arm_dynarmic_cp15.cpp | 5 +- src/core/arm/dynarmic/arm_dynarmic_cp15.h | 5 +- src/core/core.cpp | 5 +- src/core/core.h | 5 +- src/core/file_sys/errors.h | 5 +- src/core/frontend/emu_window.cpp | 5 +- src/core/frontend/emu_window.h | 5 +- src/core/hle/ipc.h | 5 +- src/core/hle/ipc_helpers.h | 5 +- src/core/hle/kernel/k_client_port.cpp | 5 +- src/core/hle/kernel/k_client_port.h | 5 +- src/core/hle/kernel/k_process.cpp | 5 +- src/core/hle/kernel/k_process.h | 5 +- src/core/hle/kernel/k_shared_memory.cpp | 5 +- src/core/hle/kernel/k_shared_memory.h | 5 +- src/core/hle/result.h | 5 +- src/core/memory.cpp | 5 +- src/core/memory.h | 5 +- src/core/perf_stats.cpp | 5 +- src/core/perf_stats.h | 5 +- src/core/telemetry_session.cpp | 5 +- src/core/telemetry_session.h | 5 +- src/input_common/CMakeLists.txt | 3 + src/input_common/drivers/sdl_driver.cpp | 5 +- src/input_common/drivers/sdl_driver.h | 5 +- src/input_common/drivers/tas_input.cpp | 2 +- src/input_common/drivers/udp_client.cpp | 5 +- src/input_common/drivers/udp_client.h | 5 +- .../helpers/stick_from_buttons.cpp | 5 +- src/input_common/helpers/stick_from_buttons.h | 5 +- .../helpers/touch_from_buttons.cpp | 5 +- src/input_common/helpers/touch_from_buttons.h | 5 +- src/input_common/helpers/udp_protocol.cpp | 5 +- src/input_common/helpers/udp_protocol.h | 5 +- src/input_common/main.cpp | 5 +- src/input_common/main.h | 5 +- src/network/CMakeLists.txt | 3 + src/shader_recompiler/CMakeLists.txt | 3 + .../impl/logic_operation_three_input_lut3.py | 6 +- src/tests/CMakeLists.txt | 3 + src/tests/common/bit_field.cpp | 5 +- src/tests/common/param_package.cpp | 5 +- src/tests/tests.cpp | 5 +- src/video_core/CMakeLists.txt | 3 + src/video_core/host_shaders/CMakeLists.txt | 3 + .../host_shaders/StringShaderHeader.cmake | 3 + .../host_shaders/source_shader.h.in | 3 + .../vulkan_present_scaleforce_fp16.frag | 3 + .../vulkan_present_scaleforce_fp32.frag | 3 + src/video_core/renderer_base.cpp | 5 +- src/video_core/renderer_base.h | 5 +- .../renderer_opengl/gl_rasterizer.cpp | 5 +- .../renderer_opengl/gl_rasterizer.h | 5 +- .../renderer_opengl/gl_resource_manager.cpp | 5 +- .../renderer_opengl/gl_resource_manager.h | 5 +- .../renderer_opengl/gl_shader_util.cpp | 5 +- .../renderer_opengl/gl_shader_util.h | 5 +- .../renderer_opengl/renderer_opengl.cpp | 5 +- .../renderer_opengl/renderer_opengl.h | 5 +- src/video_core/surface.cpp | 5 +- src/video_core/surface.h | 5 +- src/video_core/video_core.cpp | 5 +- src/video_core/video_core.h | 5 +- src/web_service/CMakeLists.txt | 3 + src/web_service/telemetry_json.cpp | 5 +- src/web_service/telemetry_json.h | 5 +- src/web_service/verify_login.cpp | 5 +- src/web_service/verify_login.h | 5 +- src/web_service/web_backend.cpp | 5 +- src/web_service/web_backend.h | 5 +- src/yuzu/CMakeLists.txt | 3 + src/yuzu/Info.plist | 6 + src/yuzu/aboutdialog.ui | 2 +- src/yuzu/bootmanager.cpp | 5 +- src/yuzu/bootmanager.h | 5 +- src/yuzu/compatdb.cpp | 5 +- src/yuzu/compatdb.h | 5 +- src/yuzu/configuration/config.cpp | 5 +- src/yuzu/configuration/config.h | 5 +- .../configuration/configuration_shared.cpp | 5 +- src/yuzu/configuration/configuration_shared.h | 5 +- src/yuzu/configuration/configure_debug.cpp | 5 +- src/yuzu/configuration/configure_debug.h | 5 +- src/yuzu/configuration/configure_dialog.cpp | 5 +- src/yuzu/configuration/configure_dialog.h | 5 +- src/yuzu/configuration/configure_general.cpp | 5 +- src/yuzu/configuration/configure_general.h | 5 +- src/yuzu/configuration/configure_graphics.cpp | 5 +- src/yuzu/configuration/configure_graphics.h | 5 +- src/yuzu/configuration/configure_hotkeys.cpp | 5 +- src/yuzu/configuration/configure_hotkeys.h | 5 +- src/yuzu/configuration/configure_input.cpp | 5 +- src/yuzu/configuration/configure_input.h | 5 +- .../configuration/configure_input_player.cpp | 5 +- .../configuration/configure_input_player.h | 5 +- .../configuration/configure_motion_touch.cpp | 5 +- .../configuration/configure_motion_touch.h | 5 +- .../configure_per_game_addons.cpp | 5 +- .../configuration/configure_per_game_addons.h | 5 +- .../configure_profile_manager.cpp | 5 +- .../configuration/configure_profile_manager.h | 5 +- src/yuzu/configuration/configure_system.cpp | 5 +- src/yuzu/configuration/configure_system.h | 5 +- .../configure_touch_from_button.cpp | 5 +- .../configure_touch_from_button.h | 5 +- .../configuration/configure_touch_widget.h | 5 +- .../configure_touchscreen_advanced.cpp | 5 +- .../configure_touchscreen_advanced.h | 5 +- src/yuzu/configuration/configure_ui.cpp | 5 +- src/yuzu/configuration/configure_ui.h | 5 +- src/yuzu/configuration/configure_web.cpp | 5 +- src/yuzu/configuration/configure_web.h | 5 +- src/yuzu/debugger/controller.cpp | 5 +- src/yuzu/debugger/controller.h | 5 +- src/yuzu/debugger/profiler.cpp | 5 +- src/yuzu/debugger/profiler.h | 5 +- src/yuzu/debugger/wait_tree.cpp | 5 +- src/yuzu/debugger/wait_tree.h | 5 +- src/yuzu/discord.h | 5 +- src/yuzu/discord_impl.cpp | 5 +- src/yuzu/discord_impl.h | 5 +- src/yuzu/game_list.cpp | 5 +- src/yuzu/game_list.h | 5 +- src/yuzu/game_list_p.h | 5 +- src/yuzu/hotkeys.cpp | 5 +- src/yuzu/hotkeys.h | 5 +- src/yuzu/main.cpp | 5 +- src/yuzu/main.h | 5 +- src/yuzu/uisettings.cpp | 5 +- src/yuzu/uisettings.h | 5 +- .../util/sequence_dialog/sequence_dialog.cpp | 5 +- .../util/sequence_dialog/sequence_dialog.h | 5 +- src/yuzu/util/util.cpp | 5 +- src/yuzu/util/util.h | 5 +- src/yuzu/yuzu.qrc | 5 + src/yuzu/yuzu.rc | 3 + src/yuzu_cmd/CMakeLists.txt | 3 + src/yuzu_cmd/config.cpp | 5 +- src/yuzu_cmd/config.h | 5 +- src/yuzu_cmd/default_ini.h | 5 +- src/yuzu_cmd/emu_window/emu_window_sdl2.cpp | 5 +- src/yuzu_cmd/emu_window/emu_window_sdl2.h | 5 +- src/yuzu_cmd/yuzu.cpp | 5 +- src/yuzu_cmd/yuzu.rc | 3 + 294 files changed, 1976 insertions(+), 546 deletions(-) create mode 100644 .reuse/dep5 rename license.txt => LICENSE.txt (99%) create mode 100644 LICENSES/Apache-2.0.txt create mode 100644 LICENSES/BSD-2-Clause.txt create mode 100644 LICENSES/BSD-3-Clause.txt create mode 100644 LICENSES/BSL-1.0.txt create mode 100644 LICENSES/CC-BY-4.0.txt create mode 100644 LICENSES/CC-BY-ND-3.0.txt create mode 100644 LICENSES/CC0-1.0.txt create mode 100644 LICENSES/GPL-2.0-or-later.txt create mode 100644 LICENSES/GPL-3.0-or-later.txt create mode 100644 LICENSES/LGPL-3.0-or-later.txt create mode 100644 LICENSES/MIT.txt create mode 100644 LICENSES/Unlicense.txt create mode 100644 LICENSES/WTFPL.txt create mode 100644 LICENSES/Zlib.txt delete mode 100644 dist/license.md diff --git a/.ci/scripts/clang/docker.sh b/.ci/scripts/clang/docker.sh index db736f72b..792ef4aa8 100755 --- a/.ci/scripts/clang/docker.sh +++ b/.ci/scripts/clang/docker.sh @@ -1,5 +1,8 @@ #!/bin/bash -ex +# SPDX-FileCopyrightText: 2021 yuzu Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + # Exit on error, rather than continuing with the rest of the script. set -e diff --git a/.ci/scripts/clang/exec.sh b/.ci/scripts/clang/exec.sh index a213aac27..664fce5f8 100644 --- a/.ci/scripts/clang/exec.sh +++ b/.ci/scripts/clang/exec.sh @@ -1,5 +1,8 @@ #!/bin/bash -ex +# SPDX-FileCopyrightText: 2021 yuzu Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + mkdir -p "ccache" || true chmod a+x ./.ci/scripts/clang/docker.sh # the UID for the container yuzu user is 1027 diff --git a/.ci/scripts/clang/upload.sh b/.ci/scripts/clang/upload.sh index fe4e6b2ac..0b4b3e330 100755 --- a/.ci/scripts/clang/upload.sh +++ b/.ci/scripts/clang/upload.sh @@ -1,5 +1,8 @@ #!/bin/bash -ex +# SPDX-FileCopyrightText: 2021 yuzu Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + . .ci/scripts/common/pre-upload.sh REV_NAME="yuzu-linux-${GITDATE}-${GITREV}" diff --git a/.ci/scripts/common/post-upload.sh b/.ci/scripts/common/post-upload.sh index a4e3070fd..7f910b2b3 100644 --- a/.ci/scripts/common/post-upload.sh +++ b/.ci/scripts/common/post-upload.sh @@ -1,11 +1,14 @@ #!/bin/bash -ex +# SPDX-FileCopyrightText: 2019 yuzu Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + # Copy documentation -cp license.txt "$DIR_NAME" +cp LICENSE.txt "$DIR_NAME" cp README.md "$DIR_NAME" if [[ -z "${NO_SOURCE_PACK}" ]]; then - tar -cJvf "${REV_NAME}-source.tar.xz" src externals CMakeLists.txt README.md license.txt + tar -cJvf "${REV_NAME}-source.tar.xz" src externals CMakeLists.txt README.md LICENSE.txt cp -v "${REV_NAME}-source.tar.xz" "$DIR_NAME" fi diff --git a/.ci/scripts/common/pre-upload.sh b/.ci/scripts/common/pre-upload.sh index a49e3fff3..705362a3c 100644 --- a/.ci/scripts/common/pre-upload.sh +++ b/.ci/scripts/common/pre-upload.sh @@ -1,5 +1,8 @@ #!/bin/bash -ex +# SPDX-FileCopyrightText: 2019 yuzu Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + GITDATE="`git show -s --date=short --format='%ad' | sed 's/-//g'`" GITREV="`git show -s --format='%h'`" ARTIFACTS_DIR="artifacts" diff --git a/.ci/scripts/format/docker.sh b/.ci/scripts/format/docker.sh index 778411e4a..a0f7a61cc 100644 --- a/.ci/scripts/format/docker.sh +++ b/.ci/scripts/format/docker.sh @@ -1,5 +1,8 @@ #!/bin/bash -ex +# SPDX-FileCopyrightText: 2019 yuzu Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + # Run clang-format cd /yuzu chmod a+x ./.ci/scripts/format/script.sh diff --git a/.ci/scripts/format/exec.sh b/.ci/scripts/format/exec.sh index c50e90d66..40ab41abd 100644 --- a/.ci/scripts/format/exec.sh +++ b/.ci/scripts/format/exec.sh @@ -1,5 +1,8 @@ #!/bin/bash -ex +# SPDX-FileCopyrightText: 2019 yuzu Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + chmod a+x ./.ci/scripts/format/docker.sh # the UID for the container yuzu user is 1027 sudo chown -R 1027 ./ diff --git a/.ci/scripts/format/script.sh b/.ci/scripts/format/script.sh index c2550c966..119abae6a 100644 --- a/.ci/scripts/format/script.sh +++ b/.ci/scripts/format/script.sh @@ -1,5 +1,8 @@ #!/bin/bash -ex +# SPDX-FileCopyrightText: 2019 yuzu Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + if grep -nrI '\s$' src *.yml *.txt *.md Doxyfile .gitignore .gitmodules .ci* dist/*.desktop \ dist/*.svg dist/*.xml; then echo Trailing whitespace found, aborting diff --git a/.ci/scripts/linux/docker.sh b/.ci/scripts/linux/docker.sh index 436155b3d..dc7446dd1 100755 --- a/.ci/scripts/linux/docker.sh +++ b/.ci/scripts/linux/docker.sh @@ -1,5 +1,8 @@ #!/bin/bash -ex +# SPDX-FileCopyrightText: 2019 yuzu Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + # Exit on error, rather than continuing with the rest of the script. set -e diff --git a/.ci/scripts/linux/exec.sh b/.ci/scripts/linux/exec.sh index 78e8aeabf..fa3d78cc2 100644 --- a/.ci/scripts/linux/exec.sh +++ b/.ci/scripts/linux/exec.sh @@ -1,5 +1,8 @@ #!/bin/bash -ex +# SPDX-FileCopyrightText: 2019 yuzu Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + mkdir -p "ccache" || true chmod a+x ./.ci/scripts/linux/docker.sh # the UID for the container yuzu user is 1027 diff --git a/.ci/scripts/linux/upload.sh b/.ci/scripts/linux/upload.sh index 3f2c2f208..8173c5728 100755 --- a/.ci/scripts/linux/upload.sh +++ b/.ci/scripts/linux/upload.sh @@ -1,5 +1,8 @@ #!/bin/bash -ex +# SPDX-FileCopyrightText: 2019 yuzu Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + . .ci/scripts/common/pre-upload.sh APPIMAGE_NAME="yuzu-${GITDATE}-${GITREV}.AppImage" diff --git a/.ci/scripts/merge/apply-patches-by-label-private.py b/.ci/scripts/merge/apply-patches-by-label-private.py index 16b45043e..c640c4c4d 100644 --- a/.ci/scripts/merge/apply-patches-by-label-private.py +++ b/.ci/scripts/merge/apply-patches-by-label-private.py @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2019 yuzu Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + # Download all pull requests as patches that match a specific label # Usage: python download-patches-by-label.py